获取从基类派生的所有对象的集合

时间:2014-09-17 21:45:21

标签: c# wpf

我有一个应用程序,其中包含许多需要添加到报表中的页面。页面数量增长很快,因此我希望能够动态地使用它们填充报表。下面的方法正确地返回页面列表,但是我无法将页面添加到报告中。

我得到参数1:无法从'System.Type'转换为'Reports.Pages.PageBase'如何更正此问题?

private void AddAllPages()
        {
            var pages = FindSubClassesOf<PageBase>();

            foreach (var pg in pages)
            {
              Report.Pages.Add(pg);
            }
        }

        public IEnumerable<Type> FindSubClassesOf<TBaseType>()
        {
            var baseType = typeof(TBaseType);
            var assembly = baseType.Assembly;

            return assembly.GetTypes().Where(t => t.IsSubclassOf(baseType));
        }

2 个答案:

答案 0 :(得分:0)

您想要创建每种类型的实例:

Activator.CreateInstance(type)

如果类型没有默认构造函数,则还需要传递构造函数参数。

答案 1 :(得分:0)

Discovering derived types using reflection

public static List<Type> FindAllDerivedTypes<T>()
{
    return FindAllDerivedTypes<T>(Assembly.GetAssembly(typeof(T)));
}

public static List<Type> FindAllDerivedTypes<T>(Assembly assembly)
{
    var derivedType = typeof(T);
    return assembly
        .GetTypes()
        .Where(t =>
            t != derivedType &&
            derivedType.IsAssignableFrom(t)
            ).ToList();

}