通过反射调用带泛型接口的方法时遇类型转换问题求助
解决方案
问题核心在于反射调用泛型方法时传入了错误的泛型参数,且未正确拆分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
相关产品推荐
相关产品推荐

