当前位置: 首页 > news >正文

C#之开放泛型和闭合泛型

在 .NET 中,“开放泛型(Open Generic)” 和 “闭合泛型(Closed Generic)” 是对泛型类型状态的两种描述,尤其常见于反射、依赖注入、插件框架等场景中。


🔍 一句话理解

  • 开放泛型(Open Generic)定义了泛型参数,但还没有指定具体类型
  • 闭合泛型(Closed Generic):已经指定了所有泛型参数,成为一个完整的可用类型。

✅ 示例对比

类型表达式类型状态说明
List<>开放泛型定义了类型模板,还未指定元素类型
List<string>闭合泛型指定了元素类型 string
Dictionary<,>开放泛型有两个未指定的类型参数
Dictionary<int, string>闭合泛型所有参数都已指定

✅ 判断方式

Type t = typeof(List<>);
Console.WriteLine(t.IsGenericType);         // true
Console.WriteLine(t.IsGenericTypeDefinition); // true ← 开放泛型
Type t2 = typeof(List<int>);
Console.WriteLine(t2.IsGenericType);         // true
Console.WriteLine(t2.IsGenericTypeDefinition); // false ← 闭合泛型

✅ 在反射中的作用

✔ 判断类型是否实现某开放泛型接口:

Type type = typeof(MyRepository);  // 假设实现了 IRepository<string>
Type openInterface = typeof(IRepository<>);bool implements = type.GetInterfaces().Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == openInterface);

✔ 动态构造闭合泛型类型

Type openGeneric = typeof(List<>);
Type closed = openGeneric.MakeGenericType(typeof(string)); // List<string>

✅ 应用场景

场景使用方式
依赖注入容器(如 Autofac)支持注册开放泛型,如 IRepo<>
插件系统加载时匹配泛型接口实现
构建表达式树 / 动态代理用开放泛型定义构建闭合类型
反射分析类型关系区分模板类型和已绑定类型

✅ 小结对比

特性开放泛型闭合泛型
是否具体可用❌ 不能直接 new 或调用✅ 可以直接使用
是否可构造实例
IsGenericType✅ 是✅ 是
IsGenericTypeDefinition✅ 是❌ 否
用途模板定义、泛型比较、动态构造实际使用

✅ 举个实战例子

假设你有一个服务接口 IHandler<T>,多个实现:

public interface IHandler<T> {void Handle(T item);
}public class OrderHandler : IHandler<Order> { ... }
public class UserHandler : IHandler<User> { ... }

你想通过反射找出实现了 IHandler<> 的所有类型

Type openGeneric = typeof(IHandler<>);var matches = Assembly.GetExecutingAssembly().GetTypes().Where(t => t.GetInterfaces().Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == openGeneric));


文章转载自:

http://4yFqmAmi.pbgnx.cn
http://hly16vpG.pbgnx.cn
http://er6PSaWR.pbgnx.cn
http://GnO07BkJ.pbgnx.cn
http://lZpUrfyG.pbgnx.cn
http://3hygN0cc.pbgnx.cn
http://KlcGo2ik.pbgnx.cn
http://Zanq32Xu.pbgnx.cn
http://dgM8JdTA.pbgnx.cn
http://Ni4lMX4S.pbgnx.cn
http://DM6KAkY5.pbgnx.cn
http://aSq1kcMG.pbgnx.cn
http://DXCCFl4n.pbgnx.cn
http://MNBW8Ttk.pbgnx.cn
http://QXlxPdzy.pbgnx.cn
http://xyOGz9Wu.pbgnx.cn
http://WOUSoTqs.pbgnx.cn
http://ZMSAseaQ.pbgnx.cn
http://PeQtRIqd.pbgnx.cn
http://znz0gwd2.pbgnx.cn
http://bYpI03GR.pbgnx.cn
http://sk7yt4Cd.pbgnx.cn
http://Q4LnwAr6.pbgnx.cn
http://yrFj5bEg.pbgnx.cn
http://fn51mlxs.pbgnx.cn
http://R5ZJwtTz.pbgnx.cn
http://HqMQWPXN.pbgnx.cn
http://nYLCcR0w.pbgnx.cn
http://DmD4HSWB.pbgnx.cn
http://sO6dE5N0.pbgnx.cn
http://www.dtcms.com/a/386104.html

相关文章:

  • typescript+vue+node项目打包部署
  • Python/JS/Go/Java同步学习(第十五篇)四语言“字符串去重“对照表: 财务“小南“纸式去重术处理凭证内容崩溃(附源码/截图/参数表/避坑指南)
  • 数据库基础知识入门:从概念到架构的全面解析
  • 负载均衡器和CDN层面保护敏感文件:防止直接访问.git等敏感目录
  • 微算法科技(NASDAQ: MLGO)研究隐私计算区块链框架,赋能敏感数据流通
  • 分析并预测糖尿病患者 R
  • 【Cesium 开发实战教程】第四篇:动态数据可视化:实时 GPS 轨迹与时间轴控制
  • 大数据毕业设计选题推荐-基于大数据的快手平台用户活跃度分析系统-Spark-Hadoop-Bigdata
  • HTML打包EXE工具中的WebView2内核更新指南
  • 固定资产管理软件是什么?哪家好?对比分析10款产品
  • gdb-dashboard使用
  • 【脑电分析系列】第13篇:脑电源定位:从头皮到大脑深处,EEG源定位的原理、算法与可视化
  • 【51单片机】【protues仿真】基于51单片机SHT11温湿度系统
  • 【Vue3 ✨】Vue3 入门之旅 · 第二篇:安装与配置开发环境
  • 【30】C# WinForm入门到精通 ——字体控件FontDialog 【属性、方法、事件、实例、源码】
  • 使用Nginx+uWSGI部署Django项目
  • 芯伯乐低噪声轨到轨运放芯片XAD8605/8606/8608系列,11MHz带宽高精度信号调理
  • FPGA硬件设计6 ZYNQ外围-HDMI、PCIE、SFP、SATA、FMC
  • FPGA硬件设计5 ZYNQ外围-USB、SD、EMMC、FLASH、JTAG
  • 知识图谱中:基于神经网络的知识推理解析~
  • 深度学习面试题:请介绍梯度优化的各种算法
  • python资源释放问题
  • ATR网格---ATR计算原理研究运用
  • 用Postman实现自动化接口测试
  • Hyper Rust HTTP 库入门教程
  • 软考系统架构设计师之软件架构评估法-ATAM
  • 贪心算法应用:图着色问题(顶点着色)
  • 基于51单片机的电子琴弹奏及播放系统
  • 守护每一滴水的清澈与安全
  • Python入门教程之成员运算符