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

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);

额外优化建议

你的代码还有几个可以完善的地方,避免后续踩坑:

  1. 精准查找目标接口:不要用FirstOrDefault()随便取第一个接口,应该明确查找IBackendParamService<>,避免取到无关接口:
var targetInterface = service.GetType().GetInterfaces()
    .FirstOrDefault(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IBackendParamService<>));
  1. 提前校验类型:在创建实例前就检查ModelType是否实现了目标接口,而不是到最后才抛模糊异常:
if (!ModelType.GetInterfaces().Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IBackendParamService<>)))
{
    throw new ArgumentOutOfRangeException(nameof(ModelType), "Service must implement IBackendParamService<>!");
}
  1. 返回实例而非接口类型:你的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 05:10:09