查找所有父类型(基类和接口)

时间:2012-01-15 07:08:30

标签: c# .net

我希望能够找到特定类型的所有父类型(基类和接口)。

EG如果我有

class A : B, C { }
class B : D { }
interface C : E { }
class D { }
interface E { }

我想看到A B C D和E和对象

这是最好的方法吗?有没有一种反射方法来做到这一点,还是我需要做一些事情。

==== EDIT ====

这样的事情?

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

我有点希望自己不必自己做,但是哦。好吧。

5 个答案:

答案 0 :(得分:29)

更一般的解决方案:

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

答案 1 :(得分:7)

要获取按类型实现的接口,请使用Type.GetInterfaces。要查看其类层次结构,您可以迭代地使用Type.BaseType,直到您点击null - 引用(通常这会在您点击System.Object后发生,但不一定 - 例如,接口-type的基本类型将直接为null)。

答案 2 :(得分:6)

懒惰的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;
}

答案 3 :(得分:2)

对于接口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)。

递归呼叫,清洗,冲洗,重复。

答案 4 :(得分:1)

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