c# - 为什么我不能使用 myObject 创建 List<>?

标签 c#

我动态创建了一个类(找到它 here )但我不明白为什么我不能用它来创建列表?

var myType = CompileResultType();
var myObject = Activator.CreateInstance(myType);
var myList = new List<myObject>();

// Error: The type or namespace name 'myObject' 
// could not be found (are you missing a using directive 
// or an assembly reference?)

我应该怎么做?

最佳答案

它们被称为泛型类型参数,因为它们需要类型,而不是实例。因此,您需要知道实际类型或使用反射创建列表对象。

Type listType = typeof(List<>);
Type dynamicClassType = listType.MakeGenericType(myObject.GetType());
object myList = Activator.CreateInstance(dynamicClassType);

但是,您无法以任何有意义的方式使用该实例,因为它是一个对象。

  • 您可以按照 Avner Shahar-Kashtan's answer 中的建议将其转换为 IList并使用非泛型方法。

    IList myList = (IList)Activator.CreateInstance(dynamicClassType);
    
  • 您也可以通过反射调用列表实例的方法。

    // roughly
    MethodInfo addMethod = myList.GetType().GetMethod("Add");
    addMethod.Invoke(myList, objectToAdd);
    
  • 或按照 Cuong Le's answer 中的建议进行操作并使用 dynamic 作为列表实例的类型。

    dynamic myList = Activator.CreateInstance(dynamicClassType);
    

关于c# - 为什么我不能使用 myObject 创建 List<>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17802562/

相关文章:

c# - slider /轨迹栏替代方案

c# - DLL 大小重要吗?

c# - 类库中的访问方法

c# - 单击菜单时如何在 MenuStrip 上制作一个切换按钮以更改颜色?

c# - 使用 CaptureElement/MediaCapture 时如何在网络摄像头之间切换?

c# - 扩展方法语法与查询语法

c# - 在异步任务中关闭 MemoryStream

c# - 异步方法可以在第一个 'await' 之前有昂贵的代码吗?

c# - 即使定义了其他主键, Entity Framework 6 也会创建 Id 列

C#克隆一个堆栈