在C#中注册所有已声明的类的子类

在我正在研究的概念validation项目中,我有一个通用的抽象类,我期望通过许多子类扩展它:

public abstract class Pet { public abstract string PetTypeName {get;} } public class Dog : Pet { public override string PetTypeName { get { return "Dog"; } } } 

我想要一个静态集合,其中包含此类的所有子类型:

 public static List AllPetTypes = new List { typeof(Dog), typeof(Cat), //... }; 

但是,当我们想要引入一个新的子类型时,这又增加了一个步骤,并且它容易出错,因为它只是程序员在运行时忘记做的事情。 如何自动创建这样的集合,包括inheritance给定父类的程序集中的每个类型?

编辑

作为回应做我将使用它的问题:

由于我们有多个客户端使用相同的SaaS产品,但可以访问门户网站“渠道”的不同子集,因此很难跟踪用户访问特定页面的方式,以及点击“完成”后应将其发送到何处“。

因此,我正在为ASP.NET门户网站创建架构的可能性,其中每个页面实际上都是一个增强的用户控件,它接受一个特定的强类型类来保存其参数,以及跟踪面包屑,URL创建所涉及的所有任务。并将其抽象出框架。 因此,框架需要知道可以像页面一样处理的所有控件。 理想情况下,在框架中创建新的用户控件并使其代码隐藏类扩展某个基类就足以将该控件注册为系统中的新页面。

这让我想到了下一个问题:将使用提出的解决方案中提到的技术在给定程序集中查找类型,在ASP.NET Web项目的上下文中工作,其中类型在代码隐藏中声明? 我不确定用户控件在什么时候被编译,或者它们被认为是Web项目程序集的一部分。 有没有人有额外的见解? (我应该把它作为一个新问题吗?)

 var targetAssembly = Assembly.GetExecutingAssembly(); // or whichever var subtypes = targetAssembly.GetTypes().Where(t => t.IsSubclassOf(typeof(Pet))); 

你可以从这样的事情开始。 这将获得与定义类型派生的定义类型相同的程序集中的所有类型。

 class Aware { public static readonly IEnumerable AllTypes; static Aware() { Type awareType = typeof(Aware); allTypes = Assembly.GetAssembly(awareType) .GetTypes() .Where(t => awareType.IsAssignableFrom(t)); } } 

测试:

 class Foo : Aware { } class Bar : Aware { } foreach (var type in Aware.AllTypes) { Console.WriteLine(type); } 

输出:

 Aware Foo Bar 

我很想知道你会用它做什么。

 Assembly.GetExecutingAssembly().GetTypes().Where(t => t.IsSubclassOf(typeof(parentClass)))