首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取类型的继承树

获取类型的继承树
EN

Stack Overflow用户
提问于 2011-04-19 13:13:02
回答 3查看 12.1K关注 0票数 15

可能重复:

To get parent class using Reflection on C#

我试图找到一种简单的方法,使用C#中的反射获取某种类型的继承树。

假设我有以下课程;

代码语言:javascript
复制
public class A
{ }

public class B : A
{ }

public class C : B
{ }

我如何使用反射类型'C‘来确定它的超类是'B',谁反过来来自'A’等等?我知道我可以使用'IsSubclassOf()',但是让我们假设我不知道我正在寻找的超类。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-04-19 13:15:43

要获取类型的直系亲属,可以使用属性。您可以迭代地调用BaseType,直到它返回null以遍历类型的继承层次结构。

例如:

代码语言:javascript
复制
public static IEnumerable<Type> GetInheritanceHierarchy
    (this Type type)
{
    for (var current = type; current != null; current = current.BaseType)
        yield return current;
}

请注意,使用System.Object作为终结点是无效的,因为并非所有类型(例如,接口类型)都是从它继承的。

票数 25
EN

Stack Overflow用户

发布于 2011-04-19 13:15:48

System.Type类型的对象具有一个名为BaseType的属性,该属性返回“当前System.Type直接继承的类型”。您可以沿着这条BaseType链一直走到null,这时您知道您已经到达System.Object了。

票数 3
EN

Stack Overflow用户

发布于 2022-08-28 21:09:46

加上上面的答案..。请找一组简单的例程。

  1. GetTree返回一个以句点分隔的子类列表,从

中传递的类开始。

  1. XInheritsFromY( )的3次重写接受一个变量,然后是字符串、类型或变量,如果X继承Y (疯狂,对吗?)

,则返回true。

请注意,如果您传入一个变量,X和Y除了类结构之外可能没有任何共同之处。

例如

代码语言:javascript
复制
mySubClassOfY X = new SubClassOfY();
myClassY  Y = new myClassY();

bool b = XInheritsFromY(X,Y)  

即使它们是不同的实例,B也是正确的。

代码语言:javascript
复制
  public static string InheritanceTree(dynamic input_)
        {
            const string dlm = ".";
            Type t = null; 
            StringBuilder  rv  = new StringBuilder();

                t= input_.GetType();
            while (1==1)
            {
                if (null == t) break;
                rv.AppendFormat("{0}{1}", dlm, t.Name);
                t = t.BaseType;
            }
            return rv.ToString();
        }
        public static bool XInheritsFromY(dynamic X_, string Y_)
        {
            //pass in a string you are curious to see if is base of X_
            string tree = InheritanceTree(X_);
            Y_ = "." + Y_;
            return tree.Contains(Y_);
        }
        public static bool XInheritsFromY(dynamic X_, Type Y_)
        {
            //pass in a Type you are curious to see if is base of X_

            return XInheritsFromY(X_, Y_.Name);
        }
        public static bool XInheritsFromY(dynamic X_, dynamic Y_)
        {
            //pass in a variable you are curious to see if is base of X_
            // note this is just looking at classes
            // Y_ may not actually be same object as X_
            return XInheritsFromy(X_, Y_.GetType().Name);
        }

@Ani的评论是正确的,即并非所有类型都是从系统对象继承的。上述代码最初编写为w/ System.Object,并进行了正确的测试。我将这5个参数更改为动态参数,这也很有效。因此,如果您使用的是c# 4.0或更高版本,您可以使用动态的,这应该是全方位的。

这是测试方法..。

代码语言:javascript
复制
[TestMethod]
        public void testInheritanceTree()
        {
            pgCashFlowMortgage m = new pgCashFlowMortgage();
            cashFlow cf = new cashFlow();
            string tree = tools.InheritanceTree(m);

            Assert.AreEqual(".pgCashFlowMortgage.cashFlow.pgBaseClass.sbBusObjBase.sbDatabaseObjBase.sbSimpleDatabaseObjBase.sbObjectBase.Object",tree);

            bool XifYyes = tools.XInheritsFromY(m, "cashFlow");
            Assert.IsTrue(XifYyes);

            XifYyes = tools.XInheritsFromY(m, cf.GetType());
            Assert.IsTrue(XifYyes);

            XifYyes = tools.XInheritsFromY(m, cf );
            Assert.IsTrue(XifYyes);

        }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5716896

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档