如何定义派生类的“列表”?

时间:2013-04-25 18:56:45

标签: c# class types derived

我有一个基类和一些派生类

public class MyBase {...}
public class MyClass1 : MyBase {...}
public class MyClass2 : MyBase {...}

现在我想列出这些派生类(类!!不是类的实例!),然后我想随机创建其中一个派生类的一个实例。

这是如何工作的?

这里我想要的伪C#:)

List<MyBase> classList = new List<MyBase> () { MyClass1, MyClass2, MyClass3, ...}

MyBase randomInstance = new classList[random.Next(0,classList.Count-1)]();

(不幸的是,这个List构造需要MyBase的实例而不是类名)

3 个答案:

答案 0 :(得分:5)

类似的东西(假设一个no-args构造函数,而B和C都是从A派生的):

List<Type> types = new List<Type> { typeof(A), typeof(B), typeof(C) };

A instance = (A)Activator.CreateInstance(types[r.Next(0, types.Count)]);

答案 1 :(得分:5)

您可以使用此类

创建
class MyBase
{
}

class MyClass1 : MyBase
{
}

class MyClass2 : MyBase
{
}

这使用System.Activator来创建对象。

void Main()
{
    var typesToPickFrom = new List<Type>()
    {
        typeof(MyBase),
        typeof(MyClass1),
        typeof(MyClass2)
    };

    var rnd = new Random();
    Type typeToCreate = typesToPickFrom [rnd.Next(typesToPickFrom.Count)];
    object newObject = Activator.CreateInstance(typeToCreate);
}

您可以根据需要进行投射。

答案 2 :(得分:3)

如你所说,如果你想“创建”一个随机实例:

var selection = random.Next(0,2)

switch (selection)
{
    case 1: return new MyBase();
    case 2: return new MyClass1();
    case 3: return new MyClass2();
}

为所有这些类定义一个公共interface可能很有用,这样您就可以从该方法返回一些内容。或者,您只需返回objectdynamic