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}) ;
如果TypeA
和TypeB
类型一样则返回true
;
如果TypeA
是TypeB
的父类则返回true
;
如果TypeB
实现了接口TypeA
则返回true
;
C# IsAssignableFrom
与IsSubClassOf
判断匿名类是否继承父类
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;
}
}