C#中如何为GetMethod传参正确获取AddService的泛型重载方法
解决方案
你遇到的匹配错误是因为未构造的泛型AddService<T>方法的第二个参数是泛型参数T,而非固定的object类型,直接传入typeof(object)无法匹配到对应重载。
最稳妥的匹配方式是通过方法特征过滤,完全避免后续新增重载带来的匹配偏差,代码修改如下:
public static IServiceCollection AddService(this IServiceCollection services, Type type, object instance) { Type classType = typeof(SampleExtensions); // 筛选符合特征的泛型重载 var methodInfo = classType.GetMethods() .Where(m => // 匹配方法名 m.Name == nameof(AddService) // 匹配是泛型方法,且泛型参数数量为1 && m.IsGenericMethodDefinition && m.GetGenericArguments().Length == 1 // 匹配参数数量为2 && m.GetParameters().Length == 2 // 匹配第一个参数类型为IServiceCollection && m.GetParameters()[0].ParameterType == typeof(IServiceCollection) // 匹配第二个参数类型就是该方法的泛型参数 && m.GetParameters()[1].ParameterType == m.GetGenericArguments()[0]) .Single(); // 可选校验:验证传入的type符合泛型约束,避免后续调用报错 if (!typeof(IService).IsAssignableFrom(type)) { throw new ArgumentException($"类型{type.FullName}未实现IService接口", nameof(type)); } MethodInfo genericMethod = methodInfo.MakeGenericMethod(type); genericMethod.Invoke(null, new[] { services, instance }); return services; }
原写法错误原因
- 你原来传入
new Type[] { typeof(IServiceCollection), typeof(object) }查找方法时,泛型方法的参数定义是(IServiceCollection, T),和object不匹配,所以返回null - 如果不传参数类型数组直接按名称查找,会同时匹配到泛型和非泛型两个
AddService方法,抛出匹配多个方法的异常
额外说明
这种按方法特征过滤的方式兼容性极强,哪怕后续你新增其他参数数量、其他泛型参数数量的AddService重载,也不会干扰到当前的匹配逻辑,不需要修改这段查找代码。
内容的提问来源于stack exchange,提问作者monty
相关产品推荐
相关产品推荐

