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

解决C#泛型类参数无法带参数实例化的问题

概要

本文提供了一个基于C#表达式目录树的方法来解决泛型参数不能调用带参数的构造方法来实例化的问题。

C#泛型的限制

我们看如下的代码,User类需要一个泛型类,泛型类是要以CreditCard为基类。

class User<T> where T :CreditCard, new()
{private readonly T _value;public User(){_value = new T();}}

以上代码可以正常运行,但是我们稍加修改,我们需要调用信用卡类的另一个构造方法,传入用户id,代码如下:

class User<T> where T :CreditCard, new()
{private readonly T _value;public User(){_value = new T(userId);}}

上面的代码是不能通过编译的,因为C#无法在创建变量类型的实例时候,传入参数。这个是C#的限制。

解决方法

我们通过构造表达式目录树,动态构建一个委托,将参数传入。目标委托的是(int userId) => T(userId),我们执行该委托方法,就可以传入参数,在创建变量类型的实例时候,传入参数。

我们定义一个方法createTWithParam(int userId)的方法,用表达式目录树实现该方法:

	public T createTWithParam(int userId) {ParameterExpression parameter = Expression.Parameter(typeof(int), "userId");ConstructorInfo ctor = typeof(T).GetConstructor(bindingAttr: BindingFlags.Instance | BindingFlags.Public,binder: null,callConvention: CallingConventions.HasThis,types: new[] { typeof(int), typeof(string) },modifiers: new ParameterModifier[] { });var expressionNew = Expression.New(ctor, new Expression[] { parameter });LambdaExpression newLambda = Expression.Lambda<Func<int, T>>(expressionNew, new ParameterExpression[] { parameter });var newLambdaDelegate = (Func<int,T>)newLambda.Compile();var creditCard = newLambdaDelegate.Invoke(number);return creditCard;}
  1. 构造Lambda表达式左侧的(int userId),变量名是userId;
  2. 构造 表达式new T(userId);
  3. 编译表达式,生成委托;
  4. 传入参数,调用该委托,生成T类型的实例。

附录

internal  class CreditCard
{public CreditCard(int userId){Console.WriteLine(userId);}public CreditCard(){}
}
http://www.xdnf.cn/news/7859.html

相关文章:

  • Speexx: Online Language Training Business Coaching Platform
  • 使用Tkinter写一个发送kafka消息的工具
  • DVWA-XSS
  • 网络流量分析工具ntopng的安装与基本使用
  • Java接口P99含义解析
  • 【713. 乘积小于 K 的子数组】
  • 目标检测 RT-DETR(2023)详细解读
  • Python 包管理工具uv常用场景使用指南
  • 在线视频下载利器,支持100多平台下载
  • [Java实战]Spring Boot整合Prometheus:应用性能监控与可视化(三十二)
  • 高级学习算法(神经网络 决策树)
  • 基于 STM32 的 PC ARGB 风扇控制器设计与实现
  • k8s-NetworkPolicy
  • Android Handler/Looper线程管理实战攻略:从零到企业级开发
  • Android车载应用开发:Kotlin与Automotive OS深度实践
  • 【VLNs篇】02:NavGPT-在视觉与语言导航中使用大型语言模型进行显式推理
  • 初识GPU加速:如何利用GPU提升AI训练效率
  • 数据直观分析与可视化
  • 如何应对kaggle离线安装环境?
  • 工具环境与系统部署
  • SQL 多表关联与分组聚合:解密答题正确率分析
  • 项目交付标准不明确,如何确保验收顺利
  • HarmonyOS NEXT应用开发实战:玩鸿蒙App客户端开发
  • 网站制作公司哪家强?(2025最新版)
  • Go语言中new与make的深度解析
  • EasyRTC嵌入式音视频通信SDK一对一音视频通信,打造远程办公/医疗/教育等场景解决方案
  • 关于sql 查询性能优化的小经验
  • 【Vue3】一文学会动态路由和编程式路由的使用
  • 前端excel表格解析为json,并模仿excel显示
  • Flink 核心概念解析:流数据、并行处理与状态