代码之家  ›  专栏  ›  技术社区  ›  Dominic Jonas

检查类是否是特定泛型的子类

c#
  •  1
  • Dominic Jonas  · 技术社区  · 6 年前

    public class HtSecurePage : UserControl, IDisposable
    {
    
    }
    
    public class HtSecureInstancePage<T1> : HtSecurePage
    {
    
    }
    
    public partial class NormalPage : HtSecurePage
    {
    
    }
    
    public partial class InstancePage : HtSecureInstancePage<ZlsManager>
    {
    
    }
    

    NormalPage 是一个 subClass 属于 HtSecurePage 我使用以下模式。

    if (typeof(NormalPage).BaseType == typeof(HtSecurePage))
    {
    
    }
    

    如果我用这个模式来对付 InstancePage ,它不工作。

    if (typeof(InstancePage).BaseType == typeof(HtSecureInstancePage<>))
    {
    
    }
    

    我要知道 Type 子类 属于 HtSecurePage HtSecureInstancePage<> 重要的 HtSecureInstancePage<ZlsManager> !) 这个 Type T1 未知。

    2 回复  |  直到 6 年前
        1
  •  2
  •   Adem Catamak    6 年前

    下面的函数检查您的类的子类是否与提供的类类型相同。如果类型是泛型的,则对泛型类型定义执行检查操作。

    方法使用

    bool isInherited = CheckIsDirectlyInherited(typeof(TestAbstract), new[] {typeof(SecondLevelAbstractClass), typeof(FirstLevelAbstract)});
    

    方法

    bool CheckIsDirectlyInherited(Type obj, Type[] baseTypes)
    {
        if (obj.BaseType == null)
            return false;
    
        var objGenericDefinition = obj.BaseType;
        if (objGenericDefinition.IsGenericType)
        {
            objGenericDefinition = objGenericDefinition.GetGenericTypeDefinition();
        }
    
        foreach (Type baseType in baseTypes)
        {
            var baseTypeDefinition = baseType;
            if (baseTypeDefinition.IsGenericType)
                baseTypeDefinition = baseType.GetGenericTypeDefinition();
    
            if (objGenericDefinition == baseTypeDefinition)
                return true;
        }
    
        return false;
    }
    
        2
  •  1
  •   AlbertK    6 年前

    是HtSecurePage的直接子类

    Console.WriteLine(typeof(HtSecureInstancePage<ZlsManager>).BaseType == typeof(HtSecurePage));
    

    是HtSecureInstancePage的直接子类<>

    static bool IsDirectSubclassOfRawGeneric(Type parent, Type toCheck)
    {
        return toCheck.BaseType.IsGenericType && parent == toCheck.BaseType.GetGenericTypeDefinition();
    }
    ...
    Console.WriteLine(IsDirectSubclassOfRawGeneric(typeof(HtSecureInstancePage<>), typeof(InstancePage)));