获取类型为的继承树



可能重复:
在C#上使用反射获取父类

我正试图找到一种简单的方法,使用C#中的反射来获得特定类型的继承树。

假设我有以下课程;

public class A
{ }
public class B : A
{ }
public class C : B
{ }

如何使用对类型"C"的反射来确定其超类是"B",而"B"又来自"A",依此类推?我知道我可以使用"IsSubclassOf((",但假设我不知道我要找的超类。

要获取类型的直接父级,可以使用Type.BaseType属性。您可以迭代调用BaseType,直到它返回null,以向上遍历类型的继承层次结构。

例如:

public static IEnumerable<Type> GetInheritanceHierarchy
    (this Type type)
{
    for (var current = type; current != null; current = current.BaseType)
        yield return current;
}

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

类型为System.Type的对象有一个名为BaseType的属性,该属性返回"当前System.type直接继承的类型"。您可以沿着BaseType的链向上走,直到获得null,此时您就知道已到达System.Object

添加到上面的答案。。。请找到一套简单的程序

  1. GetTree返回以句点分隔的子类列表,从中传递的类开始

  2. XInheritsFromY((的3个重写取一个变量,然后取一个String、Type或变量,如果X从Y继承,则返回true。(疯狂,对吧?(

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

Ex

mySubClassOfY X = new SubClassOfY();
myClassY  Y = new myClassY();
bool b = XInheritsFromY(X,Y)  

b将是真的,即使它们是不同的实例。

  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的评论是正确的,并不是所有类型都继承自System对象。上面的代码最初是用System.Object编写的,测试正确。我将这5个参数更改为动态,这也起到了作用。因此,如果您使用的是c#4.0或更高版本,您可以使用dynamic,这应该是包罗万象的。

这是测试方法。。。

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

相关内容

  • 没有找到相关文章

最新更新