在我正在进行的一个概念验证项目中,我有一个通用的抽象类,我希望它能被许多子类扩展:
public abstract class Pet {
public abstract string PetTypeName {get;}
}
public class Dog : Pet {
public override string PetTypeName { get { return "Dog"; } }
}
我想要一个静态集合,其中填充了此类的所有子类型:
public static List<Type> AllPetTypes = new List<Type> {
typeof(Dog),
typeof(Cat),
//...
};
但是当我们想要引入一个新的子类型时,这只是增加了一个步骤,而且它很容易出错,因为它只是程序员在运行时可能忘记做的另一件事。我如何自动创建这样的集合,包括我的程序集中继承给定父类的每种类型?
编辑
作为回应,我会用这个来做什么:
因为我们有多个客户使用相同的 SaaS 产品,但可以访问门户“ channel ”的不同子集,因此可能很难跟踪用户如何到达特定页面,以及一旦他们应该将他们发送到哪里点击“完成”。
所以我正在为 ASP.NET 门户集思广益架构的可能性,其中每个页面实际上都是一个增强的用户控件,它接受一个特定的、强类型的类来保存它的参数,以及跟踪面包屑所涉及的所有任务, URL 创建等被抽象到框架中。因此,框架需要知道所有可以像页面一样处理的控件。理想情况下,在框架中创建一个新的用户控件并使其代码隐藏类扩展某个基类就足以将该控件注册为系统中的新页面。
这让我想到了我的下一个问题:将在给定的程序集中查找类型,使用这个问题的建议解决方案中提到的技术,在代码中声明类型的 ASP.NET Web 项目的上下文中工作-在后面?我不太确定用户控件在什么时候被编译,或者它们是否被视为 Web 项目程序集的一部分。有没有人有额外的见解? (我应该把它作为一个新问题吗?)
最佳答案
var targetAssembly = Assembly.GetExecutingAssembly(); // or whichever
var subtypes = targetAssembly.GetTypes().Where(t => t.IsSubclassOf(typeof(Pet)));
关于c# - 在 C# 中注册一个类的所有声明的子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2203474/