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

解决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(){}
}

相关文章:

  • UML 图的细分类别及其应用
  • python训练营打卡第30天
  • Qwen 3技术报告详细解读
  • junit单元测试
  • RT_Thread——内存管理
  • 融云 uni-app IMKit 上线,1 天集成,多端畅行
  • 什么是国密、密评、商密
  • 离线服务器算法部署环境配置
  • sqlsugar查看表结构并导出word文档
  • 深入理解用于中断控制的 NVIC 寄存器
  • STM32之串口通信WIFI上云
  • PyTorch中cdist和sum函数使用详解
  • 25、工业防火墙 - 工控网络保护 (模拟) - /安全与维护组件/industrial-firewall-dcs-protection
  • 免费的DDOS防护对网站业务有用吗?
  • PEFT库PromptTuningConfig 配置
  • Google I/O 2025:Gemini 2.5 Pro、Project Astra 与 AI Ultra 全面解析
  • Gartner研究报告《Generative AI 赋能Digital Commerce的三种路径》学习心得
  • Python人工智能算法 模拟退火算法:原理、实现与应用
  • 阿里云合集(不定期更新)
  • 【Vue篇】重剑无锋:面经PC项目工程化实战面经全解
  • 做集团网站/郑州seo排名公司
  • 普通展示型网站/教育机构培训
  • 做网站怎么导入地图/网络营销方案ppt