【问题标题】:Creating List with non-knowing type创建不知道类型的列表
【发布时间】:2014-04-01 01:46:01
【问题描述】:

为什么在C#中我不能写

MyClass m = new MyClass(2,3);
Type T = m.GetType();
List<T> ll = new List<T>();

或类似的东西

MyClass m = new MyClass(2,3);
Type T = typeof(m);
List<T> ll = new List<T>();

??

是否可以更改此代码并编写类似的内容??

【问题讨论】:

标签: c#


【解决方案1】:

虽然泛型是在运行时解析的,但编译器提供了安全检查。因此,它要求您在键入 List&lt;MyClass&gt;...= 之类的语句时指定类名而不是 Type 的实例

即指定类型而不是传递类型实例。

如果您希望拥有在执行时解析的泛型,则必须使用反射。 看 http://msdn.microsoft.com/en-us/library/system.type.makegenerictype%28v=vs.110%29.aspx

【讨论】:

    【解决方案2】:

    你可以试试这样的:

    Type x = typeof(Foo);
    Type listType = typeof(List<>).MakeGenericType(x);
    object list = Activator.CreateInstance(listType);
    

    您可以将Activator 的结果转换为IList 以访问其方法。

    var list = (IList)Activator.CreateInstance(listType);
    

    当然你不应该期望这里有任何类型安全,因为结果列表在编译时是 object 类型的。使用 List 会更实用,但类型安全性仍然有限,因为 Foo 的类型仅在运行时才知道。

    您还可以阅读更多相关信息here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-26
      • 1970-01-01
      • 1970-01-01
      • 2021-12-22
      • 2015-03-18
      • 2022-01-15
      • 1970-01-01
      相关资源
      最近更新 更多