【问题标题】:c# generic method + reflection questionc#泛型方法+反射题
【发布时间】:2010-09-01 08:34:40
【问题描述】:

在 C# 中,我想创建一个通用方法:

  1. 接受 MethodInfo 对象作为参数。
  2. 返回调用 MethodInfo 时返回的对象。

我感到困惑的根源在于,我希望该方法被通用类型化为与传入的 MethodInfo 对象相同的返回类型。

【问题讨论】:

    标签: c# .net generics reflection


    【解决方案1】:

    你不能这样做。根据定义,泛型是一种编译时构造,而特定 MethodInfo 的返回类型仅在运行时才知道(当您收到特定的 MethodInfo 实例时),并且会因调用而异。

    【讨论】:

    • 我不知道只是说这是不可能的是否公平。例如,您可以创建一个包装器 MethodInfo 以保证它返回 T 类型的对象,并且仍然受益于编译时泛型(只要您的用例至少可以确保您在编译时知道 T) .
    • 该问题要求该方法采用MethodInfo 的实例,而不是其他类型的实例。这是有道理的,因为MethodInfo 是您从反射中得到的。当然,如果你真的知道它将在编译时返回的类型,你可以用强制转换来包装它,但这首先违背了这样做的目的。
    • 好吧,我很难想象一个场景,你想要这样做并且在编译时不知道返回类型 - 如果你不知道,那么泛型在第一名。如果你这样做了,那么会有一些用例,例如扫描程序集以查找与某种格式(包括返回类型)匹配的方法并将它们聚合为 MethodInfo 对象,例如作为模板库的一部分等。
    【解决方案2】:

    帕维尔·米纳耶夫是对的,

    在这种情况下我的建议(当然我不知道整个上下文)是使用返回动态类型的方法,当然是不会输入的。

    public dynamic MyMethod(MethodInfo methodInfo)
    

    或者既然你知道返回类型是什么,就把它放在方法调用中:

    public T MyMethod<T>(MethodInfo methodInfo)
    

    当然,您会在映射转换的方法中遇到麻烦。 但您也可以使用 lambda 将转换放入参数中,例如:

    public T MyMethod<T>(MethodInfo methodInfo, Func<object, T> conversion)
    

    我觉得方法的调用会很清楚,比如:

    Console.WriteLine(MyMethod(methodInfo, (a) => Convert.ToString(a)));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-10
      • 2013-07-12
      • 2014-11-27
      相关资源
      最近更新 更多