迭代基类的子类并实例化它们

时间:2017-02-08 18:52:26

标签: c#

我有一个基类,以及从中继承的大量子类。我希望创建一个包含每个子类实例中的三个的列表。目前我必须这样做:

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等)。

有更好的方法吗? 我只是要做很长的事情吗?

1 个答案:

答案 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 {
    }