如何从param数组中实例化特定的子类型?

时间:2013-08-25 21:50:26

标签: c# inheritance reflection

请考虑以下代码:

public abstract class BaseClass {
    abstract void DoWork();
    virtual void MoreWork() {
        Console.WriteLine("MoreWork");
    }
}
public class classA : BaseClass {
    public void DoWork() { DoStuffA(); }
}
public class classB : BaseClass {
    public void DoWork() { DoStuffB(); }
}

我想要一个方法,我想传递所有这些类型并让它们实例化。

void Initialize(params BaseClass[] lst) {
    for (int i = 0; i < objectList.Length; i++) {
       Activator.CreateInstance(objectList[i]); // not sure if this works.
    }
}

Initialize(classA, classB);

如何实现这样的目标呢?

1 个答案:

答案 0 :(得分:2)

您不应该将对象实例发送到initialize方法,而是它们的类型。

void Initialize(params Type[] lst) {
    foreach(Type type in lst) {
       Activator.CreateInstance(type);
    }
}

Initialize(typeof(classA), typeof(classB));

这是一个完整的例子:

    public Form1()
    {
        InitializeComponent();

        Initialize(typeof(ClassA), typeof(ClassB));
    }

    public class BaseClass { }

    public class ClassA : BaseClass { }

    public class ClassB : BaseClass { }

    public BaseClass[] Initialize(params Type[] lst)
    {
        // if we already know the item count, why not set the capacity of the list.
        List<BaseClass> instances = new List<BaseClass>(lst.Length);

        foreach (Type type in lst)
            if (type.IsSubclassOf(typeof(BaseClass)))
                instances.Add((BaseClass)Activator.CreateInstance(type));

        return instances.ToArray();
    }