如何创建类的字典,以便我可以使用键来确定要初始化的新类?

时间:2014-11-13 03:15:36

标签: c# dictionary abstract-class

根据这个问题,如何在C#中创建一个字典,其中键是一个整数,但是这些值是我可以通过仅使用Dictionary中的值来调用构造函数的类?每个类都派生自一个抽象类,它们采用相同的参数,所以我觉得我应该能够将结果引用存储在抽象类类型的变量中的新类对象中。

话虽这么说,字典的值集通常填充对象的引用,而不是类型本身。作为一个简单的例子,这就是我尝试做的事情:

abstract class BaseObject {

     int someInt;
}

class ObjectA : BaseObject {

    ObjectA (int number) {
        someInt = number;
    }
} 

class ObjectB : BaseObject {

    ObjectB (int number) {
        someInt = number;
    }
}

我希望能够做到以下几点:

Dictionary<int, ???????> objectTypes = new Dictionary<int, ???????>();

objectTypes.Add(0, ObjectA);
objectTypes.Add(1, ObjectB);

所以我最终可以:

BaseObject newObjectA, newObjectB;

newObjectA = new objectTypes[0](1000);
newObjectB = new objectTypes[1](2000);

语法可能完全不同,但我希望我至少能够理解我想要完成的任务。

2 个答案:

答案 0 :(得分:5)

你在找这样的东西吗?

var objectTypes = new Dictionary<int, Func<int, BaseObject>>();
objectTypes[0] = input => new ObjectA(input);
objectTypes[1] = input => new ObjectB(input);

objectTypes[0](1000);
objectTypes[1](2000);

这里不是存储对象,而是存储一个Func来生成每个具体对象

答案 1 :(得分:4)

Dictionary<int, Type> objectTypes = new Dictionary<int, Type>();

objectTypes.Add(0, typeof(ObjectA));
objectTypes.Add(1, typeof(ObjectB));

var newObjectA = (BaseObject)Activator.CreateInstance(objectTypes[0], new object[] {1000});

Documentation for Activator.CreateInstance


将此留在这里只是另一种方法,但Phuong的答案是在编译时更清洁和可定制的方法。

关键区别在于,如果您想在运行时或编译时动态一些东西。如果是所有编译时间,我建议使用Func方法。如果您的类型在编译时是未知的,那么您将希望使用这种方式,因为有很多方法可以使用Activator.CreateInstance动态实例化类。