2

から継承する Person と Organization の 2 つのタイプがありIContactます。

いくつかのロジックに基づいてこれらの型のいずれかを返すメソッドがあります

private Type GetPersonOrOrganisation(string some variable)
{
   either returns Person or Organisation type
}

個人または組織についてデータベースにクエリを実行するメソッドがあります。

public static IQueryable<T> Query<T>(this IUow uow) where T : IContact
        {
            return uow.Query<T>();
        }

私の質問は、返された Type を使用してGetPersonOrOrganisationクエリを呼び出す方法です。

だから、言って:

var contactType = GetPersonOrOrganisation(string some variable);

 var contact = Query<contactType>();

ここで、contactType は Person または Organization のいずれかになります。

明らかにそれはコンパイルされません。それが私の質問です。から返されたものに基づいて、データベースから適切なタイプのクエリを作成する方法GetPersonOrOrganisation

4

2 に答える 2

2

とジェネリックの間を移動するのTypeは大きな苦痛です。リファクタリングを行わない唯一の答えは次のとおりです。何かのようなもの:

var method = typeof(SomeType).GetMethod("Query").MakeGenericMethod(contactType);
// this is to getch your Query<T>(this IUow) method

var contact = (IContact)method.Invoke(null, new object[] { uow });

これはかなり恐ろしいことです。可能であれば、Query<T>メソッドをメソッドとして書き直すことをお勧めしますQuery(Type type)( を返すIContact)。これによりQuery<T>return (T) Query(typeof(T));. ただし、その逆は当てはまりません。

型のインスタンスをメソッドに渡していた場合T dynamic型/ジェネリック/メソッドの解決を実行するために使用することで、これを単純化するためにできるいくつかのトリックがあります。

于 2013-03-13T07:51:56.213 に答える
0

それをしてはいけない。しかし、実際に達成しようとしていることは何ですか?

代わりに ArrayList または List の使用を検討してください。クエリで返される型に関する変更として、次のようにメソッドを微調整できます。

public static IQueryable<T> Query<T>(this IUow uow, Type returnType) where T : IContact
{
  if(returnType is IContact) // code here
}

これはおそらくエラーのある簡単なコードです。

このstackoverflowリンクには、これに関する議論がすでにあります: c#で Type.GetType() によって返される型を使用する

于 2013-03-13T07:51:47.600 に答える