查找所有父类型(基类和接口)
本文关键字:基类 接口 类型 父类 查找 | 更新日期: 2023-09-27 18:20:15
我希望能够找到特定类型的所有父类型(基类和接口)。
EG如果我有
class A : B, C { }
class B : D { }
interface C : E { }
class D { }
interface E { }
我想看看A是B C D和E以及对象
做这件事最好的方法是什么?有没有一种反思的方法可以做到这一点,或者我需要让自己有所成就。
===编辑===
这样的事情吗?
public static IEnumerable<Type> ParentTypes(this Type type)
{
foreach (Type i in type.GetInterfaces())
{
yield return i;
foreach (Type t in i.ParentTypes())
{
yield return t;
}
}
if (type.BaseType != null)
{
yield return type.BaseType;
foreach (Type b in type.BaseType.ParentTypes())
{
yield return b;
}
}
}
我有点希望我不用自己做,但哦,好吧。
更通用的解决方案:
public static bool InheritsFrom(this Type type, Type baseType)
{
// null does not have base type
if (type == null)
{
return false;
}
// only interface or object can have null base type
if (baseType == null)
{
return type.IsInterface || type == typeof(object);
}
// check implemented interfaces
if (baseType.IsInterface)
{
return type.GetInterfaces().Contains(baseType);
}
// check all base types
var currentType = type;
while (currentType != null)
{
if (currentType.BaseType == baseType)
{
return true;
}
currentType = currentType.BaseType;
}
return false;
}
或者实际获取所有父类型:
public static IEnumerable<Type> GetParentTypes(this Type type)
{
// is there any base type?
if (type == null)
{
yield break;
}
// return all implemented or inherited interfaces
foreach (var i in type.GetInterfaces())
{
yield return i;
}
// return all inherited types
var currentBaseType = type.BaseType;
while (currentBaseType != null)
{
yield return currentBaseType;
currentBaseType= currentBaseType.BaseType;
}
}
要获得由类型实现的接口,请使用Type.GetInterfaces
。要查看其类层次结构,可以反复使用Type.BaseType
,直到达到null
-引用(通常在达到System.Object
之后才会出现这种情况,但不一定如此,例如,接口类型的基类型将直接为null
)。
懒惰的C#扩展方法:
/// <summary>
/// Extension method to check the entire inheritance hierarchy of a
/// type to see whether the given base type is inherited.
/// </summary>
/// <param name="t">The Type object this method was called on</param>
/// <param name="baseType">The base type to look for in the
/// inheritance hierarchy</param>
/// <returns>True if baseType is found somewhere in the inheritance
/// hierarchy, false if not</returns>
public static bool InheritsFrom(this Type t, Type baseType)
{
Type cur = t.BaseType;
while (cur != null)
{
if (cur.Equals(baseType))
{
return true;
}
cur = cur.BaseType;
}
return false;
}
对于接口,typeof(A).GetInterfaces()
(此处记录:http://msdn.microsoft.com/en-us/library/system.type.getinterfaces.aspx)。
对于基类,typeof(A).BaseType
(此处记录:http://msdn.microsoft.com/en-us/library/system.type.basetype.aspx)。
递归调用,清洗,漂洗,重复。
public static bool IsSubclassOfTypeOrInterface(this Type type, Type ofTypeOrInterface)
{
if (type == null)
{
throw new ArgumentNullException("type");
}
if (ofTypeOrInterface == null)
{
throw new ArgumentNullException("ofTypeOrInterface");
}
return ofTypeOrInterface.IsInterface
? type.GetInterfaces().Contains(ofTypeOrInterface)
: type.IsSubclassOf(ofTypeOrInterface);
}