动态创建某种类型的新实例

时间:2016-09-11 05:44:13

标签: c# types casting

我有这个父类“Component”,还有一些继承自它的类“Component1”,“Component2”等等。

我有一个列表List<Component> Components,我需要创建一些继承自它的类的新实例,并将它们添加到列表Components

我现在这样做的方式就像

private void AddComponent(string componentType)
{
    if (componentType == "component1")
    {
        Components.Add(new component1());
    }
    if (componentType == "component2")
    {
        Components.Add(new component2());
    }
    // and so on
}

随着我的代码变大,我需要添加更多组件。所以我想知道是否有更好的方法可以解决问题。

我环顾四周,发现这种方式对我不起作用:

    var newComponent = Activator.CreateInstance(Type.GetType(componentType));
    newComponent = Convert.ChangeType(newComponent, Type.GetType(componentType));

    Components.Add(newComponent);

它说:cannot convert from 'object' to Component

编辑:解决了,我忘记了施法。

2 个答案:

答案 0 :(得分:4)

如果派生类具有空构造函数并且您可以直接使用组件类型而不是传递字符串表示,则可以执行以下操作:

private void AddComponent<T>() where T : Component, new()
{
  Components.Add(new T());
}

/* ... */

AddComponent<Component1>();
AddComponent<Component2>();

这假设Component是所有其他组件派生的基类。

答案 1 :(得分:1)

你应该能够做到这一点:

var newComponent = Activator.CreateInstance(Type.GetType(componentType));
Components.Add((Component)newComponent);

Activator.CreateInstance只会创建对象 - 无需将其转换为其他任何内容。只需一个简单的演员表就可以将它添加到你的列表中。