C#从System.Type或类名创建派生类,然后将其添加到基类的集合中

时间:2014-03-19 06:37:42

标签: c# inheritance casting activator

我需要从System.Type或其程序集限定名创建派生类对象。我知道我可以使用类似的东西:

Activator.CreateInstance(derivedClassType)

问题是在创建之后,我还需要将此对象添加到其基类的集合中。如果我正常创建对象,我可以通过以下方式获得错误:

List<BaseClass> myObjects = new List<BaseClass>();
BaseClass obj = new DerivedClass();
myObjects.Add(obj);

但是,我无法弄清楚如何使用Activator而不是普通的对象创建。我已经存储了System.Type和类的名称,并且确定该类是从基类派生的。有没有办法做到这一点?

2 个答案:

答案 0 :(得分:2)

Activator.CreateInstance方法仅返回对象类型。你必须手动将其类型转换为基类。

尝试以下代码,

List<BaseClass> myObjects = new List<BaseClass>();
BaseClass baseClassObj = Activator.CreateInstance(derivedClassType) as BaseClass;
if(baseClassObj != null)
{
   myObjects.Add(baseClassObj);
}

答案 1 :(得分:2)

// create an object of a known type
var someObject = Activator.CreateInstance(derivedClassType);

// get the base class of the known type
var baseType = derivedClassType.BaseType;

// create a type of a generic list
Type openListType = typeof(List<>);

// set the item type of the generic list type to the base stype
Type baseTypeListType = openListType.MakeGenericType(baseType);

// create an instance of the list
dynamic baseTypeList = Activator.CreateInstance(baseTypeListType);

// add 
baseTypeList.Add(someObject);

dynamic的使用允许您不在代码中使用实际的基本类型,并使您免于使用反射的麻烦,但您有违反假设的危险,例如&#34;我确信所有这些类型都来自同一个基类,所以我不会检查它。&#34;