1

我使用这篇文章中的方法创建了一个列表 创建变量类型列表

Assembly assembly = Assembly.Load("ConsoleApplication4");
Type mytype = assembly.GetType("ConsoleApplication4.TestClass");
Type genericList = typeof(List<>).MakeGenericType(mytype);  
var mylist = Activator.CreateInstance(genericList);

我的问题是,创建列表后,如何在如下函数中使用列表:

public void TestFunction<T>(List<T> mylist)
{
//do something here
}
4

3 回答 3

1

您可以简单地更改实例化列表的最后一行

dynamic mylist = Activator.CreateInstance(genericList);

这样,编译器就不会尝试推断 myList 的(运行时)类型,而是将此任务推迟到 DLR,在您的情况下,DLR 很乐意告诉您这是一些List<mytype>

如果你在某个时候知道你的具体类型mylist当然也可以使用简单的演员表

TestFunction((List<knownType>)mylist);

首选哪一个主要是口味问题,两者之间可能存在性能差异,但与基于反射的实例化相比,差异可能不会成为瓶颈,但如果性能是主要关注点,请使用分析器。

我建议在实例化站点而不是在方法签名中使用动态的原因是使大多数代码静态类型化,以便编译器可以检查大部分代码。通过在方法签名中使用动态,您可以将该方法的所有调用转换为动态调用,而如果您使 mylist 动态类型化,您只需将使用 mylist 的语句转换为动态调用。

于 2013-08-06T19:53:28.907 回答
1

您将失去静态类型分析和编译时检查(再一次,鉴于您正在使用已经发生的反射),因此您可以将您的重写TestFunction为:

public void TestFunction(dynamic myList)
{
  // do something here
}
于 2013-08-06T19:06:39.797 回答
0

您不能以您想要的方式使用 mylist 的实例,因为 Compiler 无法推断 List 的封闭类型。您只能使用进一步的反射方法或使用开放的泛型类型检查它。

于 2013-08-06T19:05:16.480 回答