对于一个对象,我可以使用反射或其他方式获取所有子类吗?

时间:2012-01-19 15:14:40

标签: c# .net inheritance reflection

对于一个对象,我可以使用反射来获取所有子类吗?

2 个答案:

答案 0 :(得分:72)

您可以在程序集中加载所有类型,然后枚举它们以查看哪些类型实现了对象的类型。你说'对象'所以下面的代码示例不适用于接口。此外,此代码示例仅搜索与声明对象相同的程序集。

class A
{}
...
typeof(A).Assembly.GetTypes().Where(type => type.IsSubclassOf(typeof(A)));

或者按照评论中的建议,使用此代码示例搜索所有已加载的程序集。

var subclasses =
from assembly in AppDomain.CurrentDomain.GetAssemblies()
    from type in assembly.GetTypes()
    where type.IsSubclassOf(typeof(A))
    select type

两个代码示例都要求您添加using System.Linq;

答案 1 :(得分:10)

子类意味着接口?是:

this.GetType().GetInterfaces()

子类意味着基类型?好吧,c#只能有一个基类

子类是指从您的类继承的所有类?是:

编辑:(感谢vcsjones)

foreach(var asm in AppDomain.CurrentDomain.GetAssemblies())
{
        foreach (var type in asm.GetTypes())
        {
            if (type.BaseType == this.GetType())
                yield return type;
        }
}

为所有已加载的程序集执行此操作