可能重复:
在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
。
添加到上面的答案。。。请找到一套简单的程序
-
GetTree返回以句点分隔的子类列表,从中传递的类开始
-
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);
}