将匿名子类对象添加到基类列表

时间:2016-03-23 08:20:27

标签: c# list reflection polymorphism

我有一个基类(Baseclass),我从中派生了一些子类(Subclass1,Subclass2等)。 对于每个子类,我想要:

  • 使用'fixed'参数(arg1,arg2等);
  • 调用构造函数
  • 检查实例化是否有效(假设有一个常用方法IsValid);和
  • 将实例化添加到对象列表中。

以下是代码的摘录:

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));
   }
}

2 个答案:

答案 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);
            }
        }

    }
}