我有一个在基类中定义的字段,当我对子对象使用反射时,我想检索实际定义该字段的基类。有没有办法在 C# .Net 4.0 中做到这一点?
或者,有没有办法在给定 2 个不同的子类的情况下动态查找公共基类?
属性FieldInfo.DeclaringType
应指向实际定义字段的类型。
这实际上来自MemberInfo
因此也适用于属性、方法等。
对于第二个问题。这是未经测试的,但应该可以工作:
public Type GetSharedBaseType(Type a, Type b)
{
Type tempA = a;
Type tempB = b;
while (tempA != null)
{
while (tempB != null)
{
if (tempA == tempB)
return tempA;
tempB = tempB.BaseType;
}
tempA = tempA.BaseType;
tempB = b;
}
return null;
}
要查找对象属于哪个基类,请尝试此操作。
obj.GetType().DeclaringType;
要确定两个对象是否属于同一基本类型,您可以执行以下操作。
//haven't compiled the code.. you can get the basic idea. Note that `System.Object` will always be the base class for every .Net Object
bool HaveSameBase(Object a, Object b)
{
Type t = a.GetType();
List<Type> aTypeList = new List<Type>();
while(t.BaseType != System.Object)
{
aTypeList.Add(t.BaseType);
t = t.BaseType;
}
Type s = b.GetType();
while(s.BaseType != System.Object)
{
if(aTypeList.Any(item => item.Equals(s.BaseType)
return true;
s = s.BaseType;
}
return false;
}