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>当然,除非您在编译时知道类型参数,否则您将无法将其用作 a 。除非您在编译时知道类型,否则您也无法Lookup<T>像在示例中那样使用。您必须像这样调用它:

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