我有一个基类,以及从中继承的大量子类。我希望创建一个包含每个子类实例中的三个的列表。目前我必须这样做:
List<BaseClass> bigList = new List<BaseClass>;
for (int i = 0; i < 3; i++){
bigList.Add(new A());
bigList.Add(new B());
etc.
其中A和B是两个子类。有没有办法可以遍历所有类而无需单独说明它们,如下所示:
foreach (Class classname in listOfClasses){
for (int i = 0; i < classname.numberToAdd; i++){
bigList.Add(new classname());
}
}
其中'classname'实际上等同于A,B,C等。
这会有所帮助,因为实际程序更复杂,因为添加的数量因所讨论的类而异(我可能想要四个A,五个B,而不是C等)。
有更好的方法吗? 我只是要做很长的事情吗?
答案 0 :(得分:1)
使用反射查找程序集中的所有类型,并测试它们是否派生自基类。您可以使用自定义属性进行实例化计数:
class Program {
static void Main(string[] args) {
List<BaseClass> bigList = new List<BaseClass>();
foreach (var type in System.Reflection.Assembly.GetExecutingAssembly().GetTypes()) {
if (typeof(BaseClass).IsAssignableFrom(type) && !(type.IsAbstract)) {
var ctor = type.GetConstructor(Type.EmptyTypes);
if (ctor != null) {
var countAttr = Attribute.GetCustomAttribute(type, typeof(InstantiationCountAttribute)) as InstantiationCountAttribute;
if (countAttr != null) {
for (int i = 0; i < countAttr.Count; ++i) {
bigList.Add((BaseClass)ctor.Invoke(null));
}
}
}
}
}
foreach (var test in bigList) {
Console.WriteLine(test.GetType().Name);
}
}
}
abstract class BaseClass {
}
class InstantiationCountAttribute : Attribute {
public InstantiationCountAttribute(int count) {
Count = count;
}
public int Count { get; private set; }
}
[InstantiationCount(1)]
class A : BaseClass {
}
[InstantiationCount(34)]
class B : BaseClass {
}