在 GetMethod 中处理泛型类型
Posted
技术标签:
【中文标题】在 GetMethod 中处理泛型类型【英文标题】:Handle generic types in GetMethod 【发布时间】:2021-10-22 08:39:25 【问题描述】:正确定义通用版本的 AddService(services, type, instance) 中 GetMethod 的正确参数是什么(以防出现更多重载)。
我知道我可以保持方法名称不同,但我不想这样做。
由于找到多个方法版本,目前我得到 null 或异常...
代码:
namespace Sample
public interface IService
public static class SampleExtensions
public static IServiceCollection AddService<T>(this IServiceCollection services, T instance) where T : IService
//services.AddSingleton<T>(instance);
services.AddSingleton(instance.GetType(), instance); // register with the concrete implementation type
//some stuff that only works with generic T
return services;
public static IServiceCollection AddService(this IServiceCollection services, Type type, object instance)
Type classType = typeof(SampleExtensions);
MethodInfo methodInfo = classType.GetMethod // correct arguments??
(
nameof(AddService), // only name would bring 2 results
new Type[] typeof(IServiceCollection), typeof(object) // ??? instance is generic
);
MethodInfo genericMethod = methodInfo.MakeGenericMethod(type);
genericMethod.Invoke(null, new[] services, instance ); // call the generic method version
return services;
【问题讨论】:
因为 IService 实例会隐藏具体的实现类型并使所有调用都是 IService 类型。我正在研究他所做的事情:***.com/questions/60587647/… 【参考方案1】:您可以使用Type.MakeGenericMethodParameter
来表示泛型参数引用:
MethodInfo methodInfo = classType.GetMethod
(
nameof(AddService),
new Type[] typeof(IServiceCollection), Type.MakeGenericMethodParameter(0)
);
【讨论】:
在我的情况下它不起作用 - Getpublic static void AddLink<T0>(UnityAction<T0> unityAction, UnityEvent<T0> unityEvent)
By myClassType.GetMethod("AddLink", new Type[] Type.MakeGenericMethodParameter(0), Type.MakeGenericMethodParameter(0)
@DenisSivtsov 那是因为你的参数不是T0
,而是UnityAction<T0>
和UnityEvent<T0>
以上是关于在 GetMethod 中处理泛型类型的主要内容,如果未能解决你的问题,请参考以下文章
Kotlin泛型 ① ( 泛型类 | 泛型参数 | 泛型函数 | 多泛型参数 | 泛型类型约束 )