我有一个基类(Baseclass),我从中派生了一些子类(Subclass1,Subclass2等)。 对于每个子类,我想要:
以下是代码的摘录:
subclassList = new List<Type>()
{
typeof(Subclass1),
typeof(Subclass1),
...
};
List<Baseclass> objectList = new List<Baseclass>();
foreach (Type subclass in subclassList)
{
ConstructorInfo[] constructorArray = subclass.GetConstructors(BindingFlags.Public);
object o = constructorArray[0].Invoke(new object[] { arg1, arg2, ... });
if (((Baseclass)o).IsValid)
{
objectList.Add(Convert.ChangeType(o, subclass));
}
}
答案 0 :(得分:0)
您正在尝试将类型为object
的项添加到objectList中。您应该将转换后的项目转换为Baseclass
以使Add
方法接受以传递编译:
var conv = Convert.ChangeType(o, subclass);
objectList.Add((Baseclass)conv);
答案 1 :(得分:0)
Convert.ChangeType
并不是真的需要,你只需要一个演员阵容。此外,如果需要调用构造函数,则可以使用Activator
类,这比使用反射更方便。
这是一个完整的工作示例:
using System;
using System.Collections.Generic;
// some fake classes just so I can compile the example
class Baseclass {
public bool IsValid {
get { return true; }
}
}
class Subclass1 : Baseclass {
}
class Subclass2 : Baseclass {
}
class Program {
static void Main(string[] args) {
var subclassList = new List<Type>() {
typeof(Subclass1),
typeof(Subclass1)
};
List<Baseclass> objectList = new List<Baseclass>();
foreach (Type subclass in subclassList) {
Baseclass newObject = (Baseclass)Activator.CreateInstance(subclass);
if (newObject.IsValid) {
objectList.Add(newObject);
}
}
}
}