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

C# 获取从基类派生的所有对象的集合,c#,wpf,C#,Wpf,我有一个应用程序,其中包含许多需要添加到报告中的页面。页面数量增长很快,因此我希望能够用它们动态填充报告。下面的方法正确返回页面列表,但我无法将页面添加到报告中 我得到参数1:无法从“System.Type”转换为“Reports.Pages.PageBase”如何更正此问题 private void AddAllPages() { var pages = FindSubClassesOf<PageBase>(); f

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

我得到参数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));
        }
private void AddAllPages()
{
var pages=FindSubClassesOf();
foreach(var pg,页)
{
报告。页码。添加(第页);
}
}
public IEnumerable FindSubClassesOf()
{
var baseType=typeof(TBaseType);
var assembly=baseType.assembly;
返回assembly.GetTypes(),其中(t=>t.IsSubclassOf(baseType));
}

要创建每种类型的实例:

Activator.CreateInstance(type)
如果类型没有默认构造函数,您也需要传递构造函数参数。

公共静态列表FindAllDerivedTypes()
{
返回FindAllDerivedTypes(Assembly.GetAssembly(typeof(T));
}
公共静态列表FindAllDerivedTypes(程序集)
{
var derivedType=类型(T);
返回组件
.GetTypes()
.其中(t=>
t!=派生类型&&
derivedType.IsAssignableFrom(t)
).ToList();
} 

混淆类型和对象是一个相当大的问题,需要一本书,而不是一个简单的答案。这里没有具体的建议,创建一个您找到的类型的对象根本不会给您一个有序的报告。您必须仔细考虑这一点。报表对象知道如何处理给定的页面。所以页面的顺序并不重要。这里的目标就是将页面添加到报表中。因此,使用此示例将是私有的void AddAllPages(){var pages=FindSubClassesOf();foreach(var pg in pages){var newpage=Activator.CreateInstance(pg);report.pages.Add(newpage);}这是正确的吗?@RobertMeier:是的,只是
pg
是一个误导性的名字。它实际上是一种类型。卓越。明天早上我会试试这个。非常感谢。
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();

}