代码改变世界

C# 中一些类关系的判定方法

  蓝之风  阅读(1477)  评论(1编辑  收藏  举报

1.  IsAssignableFrom实例方法 判断一个类或者接口是否继承自另一个指定的类或者接口。

public interface IAnimal { }
public interface IDog : IAnimal { }
public class Dog : IDog { }
public class Cate : IAnimal { }
public class Parrot { }
    	
var iAnimalType = typeof(IAnimal);
var iDogType = typeof(IDog);
var dogType = typeof(Dog);
var cateType = typeof(Cate);
var parrotType = typeof(Parrot);

Console.WriteLine(iAnimalType.IsAssignableFrom(iDogType)
    ? $"{iDogType.Name} was inherited from {iAnimalType.Name}"
    : $"{iDogType.Name} was not inherited from {iAnimalType.Name}");

Console.WriteLine(iAnimalType.IsAssignableFrom(dogType)
    ? $"{dogType.Name} was inherited from {iAnimalType.Name}"
    : $"{dogType.Name} was not inherited from {iAnimalType.Name}");

Console.WriteLine(iDogType.IsAssignableFrom(dogType)
    ? $"{dogType.Name} was inherited from {iDogType.Name}"
    : $"{dogType.Name} was not inherited from {iDogType.Name}");

Console.WriteLine(iAnimalType.IsAssignableFrom(cateType)
    ? $"{cateType.Name} was inherited from {iAnimalType.Name}"
    : $"{cateType.Name} was not inherited from {iAnimalType.Name}");

Console.WriteLine(iAnimalType.IsAssignableFrom(parrotType)
    ? $"{parrotType.Name} inherited from {iAnimalType.Name}"
    : $"{parrotType.Name} not inherited from {iAnimalType.Name}");
Console.ReadKey();

输出结果:

IDog was inherited from IAnimal
Dog was inherited from IAnimal
Dog was inherited from IDog
Cate was inherited from IAnimal
Parrot not inherited from IAnimal

2.IsInstanceOfType 判断某个对象是否继承自指定的类或者接口

Dog d=new Dog();
var result=typeof(IDog).IsInstanceOfType(d);
Console.WriteLine(result? $"Dog was inherited from IDog": $"Dog was not inherited from IDog");
Console.ReadKey();

输出结果:

Dog was inherited from IDog

3.IsSubclassOf 判断一个对象的类型是否继承自指定的类,不能用于接口的判断,只能用于判定类的关系

public interface IAnimal { }
public interface IDog : IAnimal { }
public class Dog : IDog { }
public class Husky : Dog { }
public class Cate : IAnimal { }
public class Parrot { }
Husky husky = new Husky();
var result = husky.GetType().IsSubclassOf(typeof(Dog));
Console.WriteLine(result ? $"Husky was inherited from Dog" : $"Husky was not inherited from Dog");

输出结果:

Husky was inherited from Dog

这个方法不能用于接口,如果传接口进去永远返回的都是false

Dog dog = new Dog();
var dogResult = dog.GetType().IsSubclassOf(typeof(IDog));
Console.WriteLine(dogResult);

结果:

false

编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示