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

C#进阶核心:委托、反射、泛型与异步编程实战解析 在C#编程中,委托与事件是实现解耦和发布-订阅模式的关键机制,它们通过类型安全的函数指针和封装,为构建松耦合架构提供了基础。反射技术则赋予程序在运行时动态加载和操作类型的能力,是实现插件化架构和动态扩展的核心原理。泛型通过类型参数化,解决了代码复用和类型安全的问题,而协变与逆变进一步提升了API的灵活性。异步编程通过async/await状态机模型,不仅避免了界面卡顿,更优化了I/O密集型操作的资源利用率。这些技术共同构成了C#处理复杂业务逻辑、实现高性能应用和与外部系统(如数据库、串口、OPC服务器)交互 阅读详情
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;
        }
    }
 
C#之类型获取运算符typeof typeof是C#中的编译期运算符,用于获取指定类型的 System.Type 对象,是反射和元数据操作的基础。返回包含完整类型元数据的Typ 对象,提供丰富的元数据信息和方法,包括类型名称、程序集信息、方法、属性等完整类型信息 阅读详情

相关推荐

.NET泛型约束:原理、应用与性能优化

泛型是面向对象编程中实现代码复用的重要机制,其核心价值在于类型安全与算法通用性的平衡。通过where关键字施加的泛型约束,能够在编译阶段确保类型参数符合特定条件(如实现指定接口、拥有无参构造函数等),这种静态检查机制相比运行时类型判断能提升100-200倍性能。在.NET生态中,合理的约束设计既能获得完整的智能提示支持,又能避免值类型装箱等性能损耗,特别适合仓储模式、比较器、DI容器等需要处理多类型但行为一致的场景。现代C#更通过notnull约束、静态抽象成员等特性持续强化泛型能力,结合Benchmark

weixin_33733810的博客 373

C#基础 方法之IsAssignableFrom

isAssignableFrom(Class<?> c) 标识 “当前Class 是否是给定的 Class 的超类或者超接口”。是 返回true,否则返回false。 标识 “当前Class 是否与定的 Class 的相同”。是 返回true,否则返回false。 如果 “如果该 Class 表示一个基本类型,且指定的 Class 参数正是该 Class 对象”,是则返回true,否则放回false。 public static void main(String[] args){

Ca_va的博客 5777

从零到一:Quartus II连接开发板实战,打通绘图、管脚分配、编译与下载全链路

本文详细介绍了使用Quartus II软件连接FPGA开发板并完成首个项目的全流程。从硬件连接到驱动安装,到绘制电路框图、精准分配管脚,再到编译设置与最终下载,手把手指导您打通从设计到硬件实现的完整链路,是FPGA初学者的实战入门指南。

mqtt6iot的博客 717

C# IsAssignableFrom 使用

测试框架 NetCore3.1 父类 BaseInfo 子类 UserInfo 判断子类UserInfo的父类是否是BaseInfo typeof(BaseInfo).GetTypeInfo().IsAssignableFrom(typeof(UserInfo).GetTypeInfo()) 要用GetTypeInfo() 方法 结果为True typeof(UserInfo).GetTypeInfo().IsAssignableFrom(typeof(BaseInfo).GetTypeInfo(

youwen1988的专栏 1666

【读代码】TradingAgents:基于多智能体LLM的金融交易框架深度解析

TradingAgents是由Tauric Research团队开源的创新型金融交易框架,其核心思想是通过多智能体协作系统模拟专业交易机构的决策流程。项目采用模块化设计,整合了LLM、实时数据分析、风险控制等组件,实现了从市场分析到交易执行的完整闭环。

kakaZhui的博客 2001

Labelme AI-Polygon闪退排查与修复指南

本文详细介绍了Labelme AI-Polygon功能闪退问题的排查与修复方法,包括环境配置检查、模型路径设置、依赖库版本控制等关键步骤。通过系统性的解决方案和实用技巧,帮助用户快速解决闪退问题,确保数据标注工作的高效进行。

weixin_29311017的博客 139

isAssignableFrom与instanceof的区别

在看spring源码时候,可以频繁的看到用isAssignableFrom()方法做判断,这里记录一下。 顺便比较下与instanceof的区别。 一、isAssignableFrom 假设有两个类Class1和Class2。Class1.isAssignableFrom(Class2)表示: 类Class1和Class2是否相同。 Class1是否是Class2的父类或接口。 调...

Evan's Blog ٩(๑❛ᴗ❛๑)۶ 9321

LLaMA Factory添加新模型template的实战解析

本文主要介绍了LLaMA Factory添加新模型template的实战解析,希望对使用大语言模型的同学们有所帮助。 文章目录 1. 前言 2. 实战解析 2.1 检查代码 2.2 修改代码

herosunly的博客 19万+

isAssignableFrom()方法(判断一个类是否是另一个类的父类)

isAssignableFrom()方法(判断一个类是否是另一个类的父类)

qq_43118674的博客 322

华为OD机考双机位C卷 - 评委评分 (Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 评委评分 (OD上机考试双机位C卷)。提供在线OJ刷题。Java、C++、Python、GO语言、C语言、JavaScript题解,并提供完整思路讲解。

算法大师! 1750

通过Python实现物联网金橙子自动打标

对于自家公司使用金橙子打标卡时,为了与生产线或者PLC联动等,往往需要对金橙子打标卡进行二次开发,而在二次开发中不得不涉及到MarkEzd.dll这个文件,而这个dll文件网上版本多不说,一般都没法直接使用,最后还不得不花大价钱购买专用库。而本文针对这个问题,涉法通过python来绕过MarkEzd.dll文件,直接进行自动化控制EzCad来实现联动,可应用于实际生产。文章最后拓展一下以物联网的形式,实现手机平台等登录网页,输入想要的印字内容后,远程打印的案例。

lylelo的博客 3365

C# 反射方法 IsAssignableFrom

转载地址:https://www.cnblogs.com/tomorrow0/p/14381500.html bool res = {TypeA}.IsAssignableFrom({TypeB}) ; 如果TypeA和TypeB类型一样则返回true; 如果TypeA是TypeB的父类则返回true; 如果TypeB实现了接口TypeA则返回true;

波波诸葛伟 635

使用Simulink对液流电池在微电网中的动态响应进行建模与仿真

本文介绍了使用Simulink对液流电池在微电网中的动态响应进行建模与仿真的方法。通过搭建包含液流电池、双向DC-DC变换器、分布式能源和负载的微电网模型,并设计基于SOC的控制器,详细说明了从模型创建到仿真运行的完整流程。重点分析了液流电池在不同负载条件下的动态特性,评估了系统响应速度、充放电效率和稳定性等性能指标。该仿真方法为验证液流电池在微电网中的应用提供有效工具,有助于优化参数设计和提升系统可靠性。

amy_mhd的博客 136

C# 判断类型间能否隐式或强制类型转换,以及开放泛型类型转换 update

C# 判断类型间能否隐式或强制类型转换,以及开放泛型类型转换 update 2015.02.03 如果要判断某个实例是否与其它类型兼容, C# 已经提供了两个运算符 is 和 as, Type 类也提供了 IsAssignableFrom 方法来对两个类型进行判断。 但他们实际上判断的是类型是否在继承层次结构中,而不是类型间是否可以进行转换。 例如下面的代码: 1 2 ...

cxu123321的博客 2786

WIN10系统下VS2019编译CloudCompare2.12.4

CloudCompare2.12.4

点云侠的博客 3141

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

c# 判断 泛型t 类型_.NET/C# 判断某个类是否是泛型类型或泛型接口的子类型

.NET 中提供了很多判断某个类型或实例是某个类的子类或某个接口的实现类的方法,然而这事情一旦牵扯到泛型就没那么省心了。本文将提供判断泛型接口实现或泛型类型子类的方法。.NET 中没有自带的方法对于实例,.NET 中提供了这些方法来判断:if (instance is Foo || instance is IFoo){}对于类型,.NET 中提供了这些方法来判断:if (typeof(Foo).I...

weixin_36410316的博客 2118

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

C# 判断类型间能否隐式或强制类型转换,以及开放泛型类型转换 update 2015.02.03...

如果要判断某个实例是否与其它类型兼容,C# 已经提供了两个运算符 is 和 as,Type 类也提供了 IsAssignableFrom 方法来对两个类型进行判断。但他们实际上判断的是类型是否在继承层次结构中,而不是类型间是否可以进行转换。例如下面的代码: long a = 0; Console.WriteLine(a is int); Console.WriteLine(ty...

didiao7566的专栏 661

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

C#泛型不是语法糖:CLR运行时真实类型机制解析

泛型是.NET平台实现类型安全与高性能统一的核心机制,其本质并非编译器层面的语法糖,而是CLR在运行时为每个封闭类型(如List<int>)生成独立内存布局、专用JIT代码和完整类型元数据的底层设计。它通过开放类型、封闭类型与构造过程三阶段模型支撑类型系统,结合协变/逆变保障只读/只写场景下的安全转换,并依赖泛型约束在编译期验证类型契约。这种运行时真实存在、零装箱、可内联的特性,使泛型成为高性能集合、依赖注入、领域事件处理等现代.NET架构的基石。

diaozhiwa5526的博客 332

C#判断泛型类型(List<>)和泛型接口(IEnumerable<>)的继承关系

本文主要介绍.NET(C#)中,判断某个泛型类型与泛型接口之间继承关系的代码,.NET中没有直接的方法判断。 1、通过IsAssignableFrom()方法判断的问题 var type1 = typeof(List<>); var type2 = typeof(IEnumerable<>); //return false type2.IsAssignableFrom(type1); //通过IsAssignableFrom()方法判断,方法返回是false,判断不出来它们之间的继承

极客神殿 2175

C#泛型编程:从类型安全到性能优化的核心技术解析

泛型编程是现代编程语言中实现类型安全与代码复用的核心技术。其原理是通过类型参数化,在编译时生成针对特定类型的代码版本,从而在编译阶段确保类型安全,避免运行时类型转换错误。这一机制的技术价值在于彻底消除了非泛型集合中的装箱拆箱操作,显著提升了程序性能,特别是在处理值类型数据时。在应用场景上,泛型广泛应用于集合类、算法封装、依赖注入框架和ORM数据访问层等。本文以C#语言为例,深入探讨了泛型在解决类型安全问题和性能优化中的具体实践,特别是通过泛型约束和编译时类型模具机制,实现了高效的代码复用。

weixin_30664615的博客 342

.NET(C#)判断泛型类型(List<>)和泛型接口(IEnumerable<>)的继承关系代码

.NET (C#) 中,判断泛型类型(如 List<>)和泛型接口(如 IEnumerable<>)的继承关系,可以使用反射。反射允许在运行时获取类型信息,并判断类型之间的关系。本文主要介绍.NET(C#)中,判断某个泛型类型与泛型接口之间继承关系的代码,.NET中没有直接的方法判断。

weixin_52026996的博客 141

C# 中 IsAssignableFrom 反射中一个非常重要的方法

IsAssignableFrom是C#反射中用于检查类型兼容性的方法,判断一个类型能否接受另一个类型的实例赋值。它检查继承关系(父类可接受子类)和接口实现关系(接口可接受实现类)。典型应用场景包括依赖注入容器中的服务注册检查(验证实现类是否符合接口)、插件系统(加载符合特定接口的插件类)以及验证器系统等。通过该方法可以确保类型安全,避免运行时类型不匹配错误。

ultramand的博客,重生之我在cad上二次开发猛猛敲C#代码~ 625

C# IsAssignableFrom与IsSubClassOf 判断匿名类是否继承父类

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

dengqiu2187的博客 916

C#基础 Type IsAssignableFrom 类是否实现了指定的接口

 .NET Framework : 4.7.2        IDE : Visual Studio Community 2019         OS : Windows 10 x64     typesetting : Markdown         blog : blog.youkuaiyun.com/yushaopu        gi...

心少朴 3686

Type.IsSubclssOf and Type.IsAssignableFrom

Type.IsSubclssOf and Type.IsAssignableFromIsSubClassOfIsAssignableFrom性能开销 Type这个类有两个非常有用的方法: IsSubClassOf和IsAssignableFrom。允许调用者在运行时确定任意两个类型是否有继承关系。 IsSubClassOf 微软MSDN文档上对IsSubClassOf的描述如下: Determines whether the class represented by the current Type de

前进,达瓦里希 612

如何确定类型是否使用C#反射实现接口

C# 反射是否提供确定某些给定的System.Type类型是否为某些接口建模的方法? public interface IMyInterface {} public class MyType

p15097962069的博客 1387
上一篇: 【 .NET Core 3.0 】框架之九 || 依赖注入 与 IoC
下一篇: .net core json配置相关用法
.NET跨平台
博客等级 码龄15年 6066粉丝 738原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值