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

通过反射调用带泛型接口的方法时遇类型转换问题求助

解决方案

问题核心在于反射调用泛型方法时传入了错误的泛型参数,且未正确拆分DTO类型与策略泛型类型的构建逻辑。以下是具体修正步骤:

1. 拆分类型获取逻辑

先分别获取DTO实际类型和策略的泛型定义类型,再组合出带DTO参数的具体策略类型:

string strategyName = "JsonStrategy";
string dtoName = "PoDtoA";
string namespacePrefix = "my.project.";

// 获取DTO的类型(如PoDtoA)
Type dtoType = Type.GetType(namespacePrefix + dtoName);
// 获取策略的泛型定义(如JsonStrategy`1)
Type strategyGenericDef = Type.GetType(namespacePrefix + strategyName + "`1");
// 构造绑定了DTO类型的具体策略类型(如JsonStrategy<PoDtoA>)
Type strategyType = strategyGenericDef.MakeGenericType(dtoType);

2. 创建策略实例

var strategy = Activator.CreateInstance(strategyType);

3. 正确调用泛型反序列化方法

ConversionContext.Deserialise的泛型参数是DTO类型而非策略类型,反射时需传入dtoType:

MethodInfo baseMethod = typeof(ConversionContext).GetMethod(nameof(ConversionContext.Deserialise));
MethodInfo genericMethod = baseMethod.MakeGenericMethod(dtoType);
// 执行调用并获取反序列化结果
var poDto = genericMethod.Invoke(new ConversionContext(), new object[] { strategy, po });

错误原因说明

  • 编译错误:编译器无法从object类型的strategy推断出泛型参数TDto,必须通过反射明确指定泛型类型。
  • 运行时错误:此前错误地将策略类型作为泛型参数传入MakeGenericMethod,导致方法期望IConversionStrategy<JsonStrategy<PoDtoA>>类型的参数,但实际传入的是JsonStrategy<PoDtoA>,类型完全不匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 11:05:43