C#使用IsAssignableFrom与“开放”的泛型类型

public static bool IsAssignableToGenericType(Type givenType, Type genericType)
{
    var interfaceTypes = givenType.GetInterfaces();

    foreach (var it in interfaceTypes)
    {
        if (it.IsGenericType && it.GetGenericTypeDefinition() == genericType)
            return true;
    }

    if (givenType.IsGenericType && givenType.GetGenericTypeDefinition() == genericType)
        return true;

    Type baseType = givenType.BaseType;
    if (baseType == null) return false;

    return IsAssignableToGenericType(baseType, genericType);
}

C#基础 方法之IsAssignableFrom

isAssignableFrom(Class<?> c)

标识 “当前Class 是否是给定的 Class 的超类或者超接口”。是 返回true,否则返回false
标识 “当前Class 是否与定的 Class 的相同”。是 返回true,否则返回false
如果 “如果该 Class 表示一个基本类型,且指定的 Class 参数正是该 Class 对象”,是则返回true,否则放回false

    public static void main(String[] args){
    System.out.println(String.class.isAssignableFrom(Object.class));
    System.out.println(Object.class.isAssignableFrom(String.class));

    System.out.println("----------------------------------------");
    System.out.println(int.class.isAssignableFrom(int.class));
    System.out.println(int.class.isAssignableFrom(Object.class));
    System.out.println(Object.class.isAssignableFrom(int.class));
    System.out.println(Integer.class.isAssignableFrom(Object.class));
    System.out.println(Object.class.isAssignableFrom(Integer.class));

    System.out.println("----------------------------------------");

    System.out.println(Person.class.isAssignableFrom(Object.class));
    System.out.println(Object.class.isAssignableFrom(Person.class));
    System.out.println(Person.class.isAssignableFrom(Person.class));
    System.out.println(Person.class.isAssignableFrom(Serializable.class));
    System.out.println(Serializable.class.isAssignableFrom(Person.class));
    System.out.println(Person.class.isAssignableFrom(SuperA.class));
    System.out.println(SuperA.class.isAssignableFrom(Person.class));

    System.out.println("----------------------------------------");

    System.out.println(List.class.isAssignableFrom(ArrayList.class));
    System.out.println(ArrayList.class.isAssignableFrom(List.class));
}

class Person implements Serializable, A{}

interface A extends SuperA{}

interface SuperA{}
false
true
======================
true
false
false
false
true
======================
false
true
true
false
true
false
true
=======================
true
false

C# IsAssignableFrom & IsInstanceOfType & IsSubclassOf

直观测试代码如下:

public partial class NaviControl : UserControl, ITestControl
{
    public NaviControl()
    {
        InitializeComponent();
        Load += NaviControl_Load;
    }
 
    private void NaviControl_Load(object sender, EventArgs e)
    {
        Debug.Print($"Base.IsAssignableFrom:");
        Debug.Print($"{typeof(UserControl).IsAssignableFrom(this.GetType())}");//True
        Debug.Print($"{typeof(ITestControl).IsAssignableFrom(this.GetType())}");//True
        Debug.Print($"This.IsAssignableFrom:");
        Debug.Print($"{this.GetType().IsAssignableFrom(typeof(UserControl))}");//False
        Debug.Print($"{this.GetType().IsAssignableFrom(typeof(ITestControl))}");//False
        Debug.Print($"Base.IsInstanceOfType:");
        Debug.Print($"{typeof(UserControl).IsInstanceOfType(this)}");//True
        Debug.Print($"{typeof(ITestControl).IsInstanceOfType(this)}");//True
        Debug.Print($"This.IsSubclassOf:");
        Debug.Print($"{this.GetType().IsSubclassOf(typeof(UserControl))}");//True
        Debug.Print($"{this.GetType().IsSubclassOf(typeof(ITestControl))}");//False
        Debug.Print($"This.Is:");
        Debug.Print($"{(this is UserControl)}");//True
        Debug.Print($"{(this is ITestControl)}");//True
    }
}


C# 反射方法 IsAssignableFrom

bool res = {TypeA}.IsAssignableFrom({TypeB}) ;

如果TypeATypeB类型一样则返回true

如果TypeATypeB的父类则返回true;

如果TypeB实现了接口TypeA则返回true;

在这里插入图片描述


C# IsAssignableFromIsSubClassOf 判断匿名类是否继承父类

public class Dog : Animal
    {
        public string name { get; set; }
    }
    public class Animal
    {
        public string id { get; set; }
    }

    public class Main
    {
        public void Main()
        {
            Dog aa = new Dog { name = "狗", id = "动物" };
            CheckClass(aa);
        }
        public void CheckClass<T>(T entity)
        {
            bool re1 = typeof(Animal).IsAssignableFrom(typeof(T));
            //返回true的条件是Dog类直接或间接的实现了Animal类;
            bool re2 = typeof(T).IsSubclassOf(typeof(Animal));
            //返回true的条件是Dog类是Animal的子类
            
            var id = (entity as Animal).id;
        }
    }
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值