【问题标题】:C# : instantiate a List, given a reference to a Type [duplicate]C#:实例化一个列表,给定一个类型的引用[重复]
【发布时间】:2009-07-20 17:38:44
【问题描述】:

假设在 C# 中,myType 是对某些 Type 的引用。 仅使用myType,是否可以创建myType 对象的List

比如下面的代码,虽然是错误的,但是我想通过实例化

new List <myType> ( ) .

using System ;
using System.Reflection ;
using System.Collections.Generic ;

class MyClass
    {
    }

class MainClass
    {

    public static void Main ( string [] args )
        {

        Type  myType  =  typeof ( MyClass ) ;

        List < myType >  myList  =  new List < myType > ( ) ;

        }

    }

【问题讨论】:

  • 您的代码中有一个更明显的错误:List = new List();需要: List myList = new List();

标签: c# list


【解决方案1】:

您可以使用反射来做到这一点:

Type typeList = typeof(List<>);
Type actualType = typeList.MakeGenericType(myType);
object obj = Activator.CreateInstance(actualType);

【讨论】:

  • 其实我觉得你这里有个小错误。您正在创建 List 的实例,因此您应该强制转换为 var obj = (List<myclass>)Activator.CreateInstance(actualType);</myclass>
  • 这个建议的解决方案是指“MyClass”——我想在不引用“MyClass”的情况下实现该解决方案,而是只使用“myType”。
  • typeof(MyClass) 替换为myType,您就有了解决方案。显然,您必须摆脱第三行中的强制转换,并使用反射来处理创建的列表 - 如果您在编译时不知道类型,则没有其他方法。
  • 我更新了我的答案。这就是我在发布之前没有校对它的结果。
  • 看起来这对我有用......谢谢你,安迪,也感谢其他所有人。
【解决方案2】:
【解决方案3】:

有没有使用的理由

List<myType>' instead of List`

本质上,您的代码希望将其类型在编译时未知的对象存储在集合(列表)中。

我想说,如果您打算制作此生产代码,请使用 List 或使用继承并存储基类列表。

【讨论】:

    【解决方案4】:

    你可以使用反射,但是由于返回列表的类型在编译时是未知的,所以代码使用返回列表必须通过一个loosely-typed 接口。

    与仅使用列表相比,这不会产生更快或可维护的代码。

    更好的解决方案是创建一个 Listinterface>,其中 interface> 是最强的common 接口或所有的基类您可以在运行时放入列表中的类型。至少这样,在使用列表成员时,您不必在对象中来回转换,并且您将对放入列表中的各种事物进行一些编译时验证。

    【讨论】:

      【解决方案5】:

      这是不可能的,因为myType 在编译时是未知的,您无法在代码中操作此列表。你可以使用反射来创建一个数组。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-08
        • 1970-01-01
        • 1970-01-01
        • 2020-01-01
        • 2016-11-16
        • 1970-01-01
        相关资源
        最近更新 更多