【问题标题】:For an object, can I get all its subclasses using reflection or other ways?对于一个对象,我可以使用反射或其他方式获取它的所有子类吗?
【发布时间】:2012-02-14 06:06:14
【问题描述】:

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

【问题讨论】:

    标签: c# .net inheritance reflection


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 要对接口而不是对象/类执行相同的操作,请将 where 行更改为 where typeof(IMyInterface).IsAssignableFrom(type) && type.IsClass (original question)。
    【解决方案2】:

    子类意味着接口?是的:

    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;
            }
    }
    

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

    【讨论】:

    • “子类表示接口” - 抱歉,这没有意义
    • 您对“子类”一词的定义比它实际的定义多了两个。
    • 除了子类定义问题之外,这个答案并没有解决这个问题,因为它不会返回层次结构中超过 1 级的子类。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-24
    • 2019-02-02
    • 2012-01-14
    • 2018-04-27
    • 2013-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多