如何获取嵌套泛型类型的类型

本文关键字:嵌套 泛型类型 类型 获取 何获取 | 更新日期: 2023-09-27 18:35:59

有一个第三方组件库,如下所示:

 public static class GenericExcuteTestClassExtension
 {
    public static void Excute<T>(this GenericExcuteTestClass clazz,
                             string parameter, Action<ReturnClass<T>> callback)
    {
        ReturnClass<T> rClazz = new ReturnClass<T>(parameter);
        rClazz.Property5 = typeof(T).ToString();
        callback.Invoke(rClazz);
    }
    public static void Excute<T>(this GenericExcuteTestClass clazz,
                               string parameter, Action<ReturnClass> callback)
    {
        ReturnClass rClazz = new ReturnClass(parameter);
        rClazz.Property5 = typeof(T).ToString();
        callback.Invoke(rClazz);
    }
}

我想反思以调用方法Excute<T>(this GenericExcuteTestClass clazz, string parameter, Action<ReturnClass<T>> callback).

  1. 我使用 typeof(GenericExcuteTestClassExtension).GetMethod("Excute", new Type[] { typeof(GenericExcuteTestClass), typeof(string), typeof(Action<ReturnClass<>>)}) ,但编译器收到错误"预期类型"。我怎样才能得到(Action<ReturnClass<>>)类型,Action<>可以遵守,但这不是我的期望。

  2. 我想将自定义action<ReturnClass<>>(如(result)=>{....}传递给该方法),我该怎么做?

请帮忙,谢谢。

为什么我使用反射来执行这个?

因为此方法必须在 aop 截距中执行

这个真实情况是这样的:

我想在我的应用程序中使用 restsharp,我编写了一个类似

 [RestfulService(Constants.BASE_URL + "/login")]
 public interface UserService
 {
    [Request("/login")]
    void Login([Paramter] string name, [Paramter] string password, Action<T> callBack);
 }

和 拦截接口获取参数以执行 restsharp ExecuteAsync<T>(this IRestClient client, IRestRequest request, Action<IRestResponse<T>> callback)以获取数据。

所以我需要将用户服务中的T传递给 Intercept 方法public void Intercept(IInvocation invocation) of castle.windsor中的ExecuteAsync<T>,在此方法体中,我们只能得到 GenericType 的类型不能得到 T,所以如果我直接调用 ExecuteAsync,我无法将 GenericType T 传递给此方法。我必须这样使用:...GetMethod("...").MakeGenericType(new Type[]{piLast.ParameterType.GenericTypeArguments})

如何获取嵌套泛型类型的类型

整个问题来自这样一个事实,即 .NET 中的反射系统不能很好地处理嵌套泛型类型。

在您的情况下,最简单的解决方案是自己过滤方法。一个快速和肮脏的片段:

MethodInfo method = null;
foreach (var m in typeof(GenericExcuteTestClassExtension)
                  .GetMethods(BindingFlags.Public | BindingFlags.Static))
{
    var parameters = m.GetParameters();
    if (!parameters.Any())
        continue;
    var lastParameterType = parameters.Last().ParameterType;
    var genericArgument = lastParameterType
        .GetGenericArguments()
        .SingleOrDefault();
    // you can/should add more checks, using the Name for example
    if (genericArgument != null && genericArgument.IsGenericType)
    {
        method = m;
        break;
    }
}

您可能应该从中创建一个实用程序方法。可以在此处找到允许搜索具有嵌套泛型的任何方法的通用方法。这里还有另一种使用Expressions的可能性。