C#反射调用方法时抛出“Object does not match target type.”异常
问题分析与解决:Object does not match target type异常
你遇到的问题核心是调用MethodInfo.Invoke时传错了目标对象:
inf是接口的Type类型对象,而Invoke要求第一个参数是实现该接口的具体实例,也就是你通过Activator.CreateInstance(ModelType)创建的service对象。- 接口本身不能被实例化,你传
inf进去,CLR自然会报错“对象类型不匹配”。
修正后的关键代码
把这一行:
method.Invoke(inf, null);
改成:
method.Invoke(service, null);
额外优化建议
你的代码还有几个可以完善的地方,避免后续踩坑:
- 精准查找目标接口:不要用
FirstOrDefault()随便取第一个接口,应该明确查找IBackendParamService<>,避免取到无关接口:
var targetInterface = service.GetType().GetInterfaces() .FirstOrDefault(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IBackendParamService<>));
- 提前校验类型:在创建实例前就检查
ModelType是否实现了目标接口,而不是到最后才抛模糊异常:
if (!ModelType.GetInterfaces().Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IBackendParamService<>))) { throw new ArgumentOutOfRangeException(nameof(ModelType), "Service must implement IBackendParamService<>!"); }
- 返回实例而非接口类型:你的
Resolve方法返回的是inf(Type对象),这大概率不符合预期,应该返回service实例本身,或者转换为目标接口类型:
return service; // 或者 return (IBackendParamService<YourType>)service;
优化后的完整代码示例
private readonly Type? ModelType; public object Resolve() { if (ModelType == null) { throw new ArgumentOutOfRangeException(nameof(ModelType), "Type not found!"); } // 提前校验类型是否符合要求 var implementsTargetInterface = ModelType.GetInterfaces() .Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IBackendParamService<>)); if (!implementsTargetInterface) { throw new ArgumentOutOfRangeException(nameof(ModelType), "Service must implement IBackendParamService<>!"); } var service = Activator.CreateInstance(ModelType); if (service == null) { throw new InvalidOperationException($"Failed to create instance of type {ModelType.FullName}"); } var targetInterface = service.GetType().GetInterfaces() .First(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IBackendParamService<>)); var method = targetInterface.GetMethod("LoadParameters"); method?.Invoke(service, null); return service; }
内容的提问来源于stack exchange,提问作者Miha Bogataj
相关产品推荐
相关产品推荐

