You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中如何通过反射调用含类类型参数的方法

反射调用带引用类型参数的方法解决方案

首先得点明你遇到的核心问题:你代码里直接new Product()创建的对象,类型大概率和目标Save方法要求的Product不是同一个类型——因为目标Product是在你动态加载的FFSNext.Domain.dll里定义的,而你当前代码里的Product如果是项目本地引用的,就会导致类型不匹配,反射调用直接失败。

咱们可以这样调整代码,确保参数类型完全匹配:

核心思路

  • 从动态加载的程序集中获取Product类型,而非用当前上下文的本地类型
  • 创建该动态类型的实例(如果有带参数的构造函数,需对应传参)
  • 最后通过反射调用Save方法传递这个实例

修改后的完整代码

string binPath = "你的dll所在实际路径";
// 加载目标程序集
Assembly asm = Assembly.LoadFrom($"{binPath}FFSNext.Domain.dll");

// 获取ProductClass类型
Type productClassType = asm.GetType("XXX.Domain.XY.Products.Products.Myprovider.ProductClass");
// 获取Save方法
MethodInfo saveMethod = productClassType.GetMethod("Save");

// 关键步骤:从加载的程序集中获取Product参数的真实类型(注意要写全命名空间)
Type productType = asm.GetType("XXX.Domain.XY.Products.Products.Myprovider.Product");
// 创建Product实例(如果构造函数需要参数,比如id、名称,就在CreateInstance里传入对应值)
object productInstance = Activator.CreateInstance(productType);

// 创建ProductClass的实例
object productClassInstance = Activator.CreateInstance(productClassType);

// 调用Save方法,传入正确类型的实体实例
saveMethod.Invoke(productClassInstance, new object[] { productInstance });

额外注意事项

  • 务必确认Product的完整命名空间,如果它和ProductClass不在同一个命名空间,要修改asm.GetType里的字符串
  • 如果Product有带参数的构造函数,比如public Product(int id, string name),创建实例时要写成Activator.CreateInstance(productType, 1, "测试商品")
  • 就算你的项目已经引用了FFSNext.Domain.dll,也尽量不要直接用本地的Product类型——动态加载的程序集和本地引用的可能存在版本差异,从动态加载的程序集里取类型更稳妥

内容的提问来源于stack exchange,提问作者Penguen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 03:54:37