可能重复:
To get parent class using Reflection on C#
我试图找到一种简单的方法,使用C#中的反射获取某种类型的继承树。
假设我有以下课程;
public class A
{ }
public class B : A
{ }
public class C : B
{ }我如何使用反射类型'C‘来确定它的超类是'B',谁反过来来自'A’等等?我知道我可以使用'IsSubclassOf()',但是让我们假设我不知道我正在寻找的超类。
发布于 2011-04-19 13:15:43
要获取类型的直系亲属,可以使用属性。您可以迭代地调用BaseType,直到它返回null以遍历类型的继承层次结构。
例如:
public static IEnumerable<Type> GetInheritanceHierarchy
(this Type type)
{
for (var current = type; current != null; current = current.BaseType)
yield return current;
}请注意,使用System.Object作为终结点是无效的,因为并非所有类型(例如,接口类型)都是从它继承的。
发布于 2011-04-19 13:15:48
System.Type类型的对象具有一个名为BaseType的属性,该属性返回“当前System.Type直接继承的类型”。您可以沿着这条BaseType链一直走到null,这时您知道您已经到达System.Object了。
发布于 2022-08-28 21:09:46
加上上面的答案..。请找一组简单的例程。
中传递的类开始。
,则返回true。
请注意,如果您传入一个变量,X和Y除了类结构之外可能没有任何共同之处。
例如
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的评论是正确的,即并非所有类型都是从系统对象继承的。上述代码最初编写为w/ System.Object,并进行了正确的测试。我将这5个参数更改为动态参数,这也很有效。因此,如果您使用的是c# 4.0或更高版本,您可以使用动态的,这应该是全方位的。
这是测试方法..。
[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);
}https://stackoverflow.com/questions/5716896
复制相似问题