3

次のように、宣言でリストを受け入れるように設計されたメソッドがあります。

public class MyHandler
{
    public T LookUp<T>()
    {
        //This method compiles and returns a dynamically typed List
        ...
    }
}

私はこのメソッドを他の場所から呼び出します。

MyHandler mh = new MyHandler();
List<AgeGroup> ageGroups = mh.LookUp<List<AgeGroup>>();

このプロセスはうまく機能しますが、文字列から型を動的にロードできる方法を探していAgeGroupます。

このような例を見つけましたが、この場合の実装方法がわかりません。たとえば、私は次のことを試しました(そしてコンパイルしません):

Type t = Assembly.Load("MyNamespace").GetType("MyNamespace.AgeGroup");
List<t> ageGroups = mh.LookUp<List<t>>();

も使ってみtypeof(t)ましたがダメでした。何か案は?

4

1 に答える 1

1

次のように、実行時にジェネリック型を構築できます。

Type listType = typeof(List<>);
Type typeArg = Assembly.Load("MyNamespace").GetType("MyNamespace.AgeGroup");
listType = listType.MakeGenericType(typeArg);
IList list = (IList)Activator.CreateInstance(listType);

もちろんList<AgeGroup>、コンパイル時に型パラメーターを知っていない限り、それを として使用することはできません。Lookup<T>また、コンパイル時に型がわからない限り、例のように使用することはできません。次のように呼び出す必要があります。

MethodInfo lookupMethod = mh.GetType().GetMethod("LookUp");
lookupMethod = lookupMethod.MakeGenericMethod(listType);
lookupMethod.Invoke(mh, null);
于 2013-10-21T08:59:07.560 に答える