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

C# 在C中注册一个类的所有声明的子类#,c#,reflection,C#,Reflection,在我正在进行的一个概念验证项目中,我有一个通用的抽象类,我希望它能被许多子类扩展: public abstract class Pet { public abstract string PetTypeName {get;} } public class Dog : Pet { public override string PetTypeName { get { return "Dog"; } } } 我希望使用此类的所有子类型填充静态集合: public

在我正在进行的一个概念验证项目中,我有一个通用的抽象类,我希望它能被许多子类扩展:

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),
    //...
};
公共静态列表AllPetTypes=新列表{
类型(狗),
类型(类别),
//...
};
但当我们想引入一个新的子类型时,这只是又增加了一个步骤,而且很容易出错,因为这只是程序员在运行时可能忘记做的另一件事。如何自动创建这样的集合,包括程序集中继承给定父类的所有类型

编辑 作为回答,请回答以下问题,即我将如何使用此选项:

因为我们有多个客户端使用相同的SaaS产品,但可以访问门户“频道”的不同子集,所以很难跟踪用户是如何进入特定页面的,以及单击“完成”后应该发送到哪里

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


这就引出了我的下一个问题:在给定的程序集中使用这个问题的解决方案中提到的技术来查找类型,会在ASP.NET web项目的上下文中工作吗?我不确定用户控件是在什么时候编译的,或者它们是否被认为是web项目程序集的一部分。有人有其他见解吗?(我应该把这变成一个新问题吗?

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

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

Aware
Foo
Bar
我很想知道你用这个干什么

class Aware {
    public static readonly IEnumerable<Type> 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