【问题标题】:How to create/instantiate an object of 'Type' [duplicate]如何创建/实例化“类型”的对象[重复]
【发布时间】:2011-09-15 16:22:18
【问题描述】:

我想遍历程序集中的类型,如果一个类型是指定接口的子类,我想创建一个该类型的对象并将其添加到列表中,如下所示:

var tasks = new List<IScheduledTask>();

foreach (Type t in Assembly.GetExecutingAssembly().GetTypes())
{
    if (t.IsSubclassOf(typeof(IScheduledTask)))
    {
        tasks.Add(new t());
    }
}

显然,上述方法不起作用。你怎样才能实现我的目标?

【问题讨论】:

    标签: c# .net reflection


    【解决方案1】:

    Activator.CreateInstance 是你所追求的。

    var tasks = new List<IScheduledTask>();
    foreach (Type t in Assembly.GetExecutingAssembly().GetTypes())
    {
        if (t.IsSubclassOf(typeof(IScheduledTask)))
        {
            tasks.Add((IScheduledTask)Activator.CreateInstance(t));
        }
    } 
    

    【讨论】:

    • 这将创建Object 类型的对象列表,不是吗?
    • 不,对象将是 T 类型,你只需要转换它。
    • @abe-miessler 投:tasks.Add((IScheduledTask)Activator.CreateInstance(t));
    • 啊,我在想他想创建一个从接口继承的类的实例。如果他想那样做,有可能吗?
    • @Abe-Miessler,这就是CreateInstance 在这里所做的。给它的类型是实现类型,而不是接口类型本身。你投到IScheduledTask,因为你必须这样做才能把它放在你的名单上。
    【解决方案2】:
    Activator.CreateInstance(t);
    

    会成功的。

    但要小心,您要实例化的类必须有一个没有参数的公共构造函数才能工作。

    【讨论】:

      【解决方案3】:

      看看使用Activator.CreateInstance方法:

      ObjectType instance = (ObjectType)Activator.CreateInstance(objectType);
      

      【讨论】:

        【解决方案4】:

        上一个问题可能会有所帮助 Instantiate an object with a runtime-determined type

        它使用Activator.CreateInstance

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-06-18
          • 2012-10-26
          • 1970-01-01
          • 1970-01-01
          • 2017-04-17
          • 2012-05-08
          相关资源
          最近更新 更多