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