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

本文关键字:对象 集合 获取 基类 派生 | 更新日期: 2023-09-27 18:22:12

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

我得到参数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));
        }

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

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

Activator.CreateInstance(type)

如果这些类型没有默认的构造函数,那么也需要传递构造函数参数。

使用反射发现派生类型

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