C#从反射类型实例化通用列表[重复]

Posted

技术标签:

【中文标题】C#从反射类型实例化通用列表[重复]【英文标题】:C# instantiate generic List from reflected Type [duplicate] 【发布时间】:2011-01-11 18:28:45 【问题描述】:

是否可以从 C# (.Net 2.0) 中的反射类型创建通用对象?

void foobar(Type t)
    IList<t> newList = new List<t>(); //this doesn't work
    //...

类型 t 直到运行时才知道。

【问题讨论】:

您希望如何处理在编译时不知道其类型的列表? 你能把它写成一个通用函数吗,如void foobar&lt;T&gt;() IList&lt;T&gt; newList = new List&lt;T&gt;(); 我感觉这可能是代码异味,因为以糟糕的方式处理更大的问题。 我发布了一个关于手头更大问题的单独问题:***.com/questions/4661734/… 【参考方案1】:

试试这个:

void foobar(Type t)

    var listType = typeof(List<>);
    var constructedListType = listType.MakeGenericType(t);

    var instance = Activator.CreateInstance(constructedListType);

现在如何处理instance?由于您不知道列表内容的类型,因此您可以做的最好的事情可能是将instance 转换为IList,这样您就可以拥有除object 之外的其他内容:

// Now you have a list - it isn't strongly typed but at least you
// can work with it and use it to some degree.
var instance = (IList)Activator.CreateInstance(constructedListType);

【讨论】:

+1 for typeof(List&lt;&gt;),我以前没见过这个。 var 是否存在于 .Net framework 2.0 中?! @sprocketonline: var 是 C# 3 的功能,因此如果您使用 C# 2,则需要显式声明变量。 谢谢,这个答案对我帮助很大。正是我需要的(我正在为 EF 构建表达式)【参考方案2】:
static void Main(string[] args)

  IList list = foobar(typeof(string));
  list.Add("foo");
  list.Add("bar");
  foreach (string s in list)
    Console.WriteLine(s);
  Console.ReadKey();


private static IList foobar(Type t)

  var listType = typeof(List<>);
  var constructedListType = listType.MakeGenericType(t);
  var instance = Activator.CreateInstance(constructedListType);
  return (IList)instance;

【讨论】:

+1 记住旧的非泛型支持的接口 :) 同样的技巧适用于IDictionary :)【参考方案3】:

您可以使用MakeGenericType 进行此类操作。

有关文档,请参阅 here 和 here。

【讨论】:

以上是关于C#从反射类型实例化通用列表[重复]的主要内容,如果未能解决你的问题,请参考以下文章

C#反射与特性:设计一个仿ASP.NETCore依赖注入Web

C#通过反射接口可以实例化??

在 C# 中实例化一个数组 - 从 VB 转换 [重复]

从类型到实例化对象的 Python 通用类型提示

C#反射实例化类并调用类的方法

在 C# 中的另一个对象内实例化用户定义的对象