将 return 值从调用的方法传递到泛型方法

Passing return value from invoked method to generic method

我正在构建一个模块化 API,人们可以通过使用我的自定义属性标记他们的资源方法来贡献自己的端点。如果我用我的应用程序加载他们的 dll,他们的方法就可用。当请求资源时,我的程序从他们制作的方法中获取数据集合(在他们自己的 classes 中),并在 [=31= 中发送序列化响应之前对它们应用排序和过滤(可能使用 DynamicLinq) ].这些 class 上的所有 public 字段(可能还有属性)都被视为 api 中的字段。

正如您可能意识到的那样,我在运行时只知道这些数据的类型 classes,但我希望我可以调用端点方法并将返回的 IEnumerable<SomeUnknownType> 传递给我的过滤方法无论如何。我对泛型和 C# 的内部工作原理还是有点陌生​​。

我的想法范围很广,从纯反射、序列化到最后的 JSON,然后最后解析字符串,现在是泛型。发现这个问题: Using reflection to serialize files,其中有一些 'hack',但我不太明白,无法让它发挥作用。

当集合使用通用 T 时,我只让 DynamicLinq 对我的数据进行排序。

哦,我卡在 .Net 3.5 上,所以没有动力。

public static void Main(string[] args)
{
    //Retrieves MethodInfo from a 'MethodHub' class, collected via Reflection at runtime.
    MethodInfo endpointMethod = MethodHub.GetEndpointMethod();

    // Invokes EndpointMethod. I know it will return an IEnumerable<T>, where T is unknown.
    object requestedList = method.Invoke(null, null);

    // The list should be passed to the 'Filter'-method, but it needs to be cast to its actual type first, so...
    Filter(requestedList);
}

// This is the method I want to pass the return value 'list' from 'EndpointMethod'
public static void IEnumerable<T> Filter<T>(IEnumerable<T> inputList)
{
    // Filtering inputList with DynamicLinq
}

这是一些未知的 class。

// This is the 'EndpointMethod'. The type of this IEnumerable<> is known only at runtime.
public static IEnumerable<SomeUnknownType> EndpointMethod()
{
    IEnumerable<SomeUnknownType> list = new List<SomeUnknownType>();

    return list;
}

调用GetEndpointMethod后,可以通过requestedList.GetType().GetGenericArguments().First()获取requestedList的T类型。试试这个代码:

public static void Main(string[] args)
{
      MethodInfo endpointMethod = typeof(Main).GetMethod("EndpointMethod").MakeGenericMethod(typeof(int)); //Replace Main with your class name

      object requestedList = endpointMethod.Invoke(null, null);

      var result = typeof(Main).GetMethod("Filter").MakeGenericMethod(requestedList.GetType().GetGenericArguments().First()).Invoke(null, new object[]{ requestedList });  //Replace Main with your class name
}

public static IEnumerable<T> Filter<T>(IEnumerable<T> inputList)
{
  return inputList;
}

public static IEnumerable<T> EndpointMethod<T>()
{
  IEnumerable<T> list = new List<T>();

  return list;
}