【问题标题】:Create List of Type customType创建 customType 类型列表
【发布时间】:2012-08-30 09:32:48
【问题描述】:

我正在尝试创建在运行时设置的自定义类型的列表。这怎么可能?

这是我的代码:

Type customType = typeof(string); // or someOtherVariable.GetType();

List<customType> ls = new List<customType>(); // Error: The type or namespace name `customType' could not be found

【问题讨论】:

  • 为什么不直接添加字符串而不是 customType?
  • 这段代码没有意义,你好像在创建一个字符串列表。
  • 实际上,类型将在运行时设置。例如:键入 customType = someOtherVariable.GetType();
  • Justin Niessner 的回答当然是正确的,但我要补充一点:该技术在某些情况下很有用,但大多数情况下,您可以找到另一个不需要反射且同样出色的解决方案(或者,更确切地说,更好,因为它更简单)。如果您可以发布有关为什么您想要这样做的更多详细信息,您可能会得到更好地解决更大问题的建议。

标签: c# list types


【解决方案1】:

如果你想实例化一些反射类型的通用列表,你必须使用反射来做到这一点:

var type = typeof(string);

var list = typeof(List<>);
var listOfType = list.MakeGenericType(type);

var instance = Activator.CreateInstance(listOfType);

【讨论】:

  • 变量'instance'怎么能用作列表,因为它的数据类型是var?
  • @DrRiisTab - var 不是数据类型。它只是允许编译器为您设置静态类型的快捷方式。如果要在列表中使用instance,则必须使用通用重载:msdn.microsoft.com/en-us/library/0hcyx2kd(v=vs.110).aspx
【解决方案2】:

你不能这样做。泛型集合在编译时是强类型的。您也许可以发出/codegen 一个新类并在需要时动态编译它,但这是一个非常不同的问题

【讨论】:

  • 或者,您可以使用反射。 (我没有否决这个答案,但我认为这是其他人这样做的原因。)
猜你喜欢
  • 2014-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-14
  • 2012-10-27
  • 1970-01-01
  • 1970-01-01
  • 2021-12-19
相关资源
最近更新 更多