我需要从System.Type或其程序集限定名创建派生类对象。我知道我可以使用类似的东西:
Activator.CreateInstance(derivedClassType)
问题是在创建之后,我还需要将此对象添加到其基类的集合中。如果我正常创建对象,我可以通过以下方式获得错误:
List<BaseClass> myObjects = new List<BaseClass>();
BaseClass obj = new DerivedClass();
myObjects.Add(obj);
但是,我无法弄清楚如何使用Activator而不是普通的对象创建。我已经存储了System.Type和类的名称,并且确定该类是从基类派生的。有没有办法做到这一点?
答案 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;