从调用的方法向通用方法传递返回值

时间:2019-07-09 19:23:49

标签: c# .net-3.5

我正在构建一个模块化API,人们可以通过使用我的自定义属性标记其资源方法来为自己的端点做出贡献。如果我在应用程序中加载其dll,则它们的方法可用。当请求资源时,我的程序从它们制作的方法(在自己的类中)获取数据集合,并对其进行排序和过滤(可能使用DynamicLinq),然后再以JSON发送序列化响应。这些类上的所有公共字段(也许还有属性)都被视为api中的字段。

您可能会意识到,我只在运行时知道这些数据类的类型,但是我希望可以调用端点方法并将返回的IEnumerable<SomeUnknownType>传递给我的Filtering方法。对于泛型和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
}

这是一个未知的班级。

// 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;
}

1 个答案:

答案 0 :(得分:1)

调用GetEndpointMethod之后,您可以通过requestedList.GetType().GetGenericArguments().First()获取requestList的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;
}