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

【讨论】:

在我的情况下它不起作用 - Get public static void AddLink&lt;T0&gt;(UnityAction&lt;T0&gt; unityAction, UnityEvent&lt;T0&gt; unityEvent) By myClassType.GetMethod("AddLink", new Type[] Type.MakeGenericMethodParameter(0), Type.MakeGenericMethodParameter(0) @DenisSivtsov 那是因为你的参数不是T0,而是UnityAction&lt;T0&gt;UnityEvent&lt;T0&gt;

以上是关于在 GetMethod 中处理泛型类型的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin泛型 ① ( 泛型类 | 泛型参数 | 泛型函数 | 多泛型参数 | 泛型类型约束 )

GetMethod 的 Type[] 以获取具有两个参数和一个类型参数的泛型方法

JAVA——泛型类和泛型方法(静态方法泛型)

2018-7-26-随笔-泛型

泛型类中的数组

java泛型——泛型类泛型方法泛型接口