【问题标题】:Using generics and methodinfo使用泛型和方法信息
【发布时间】:2009-01-12 02:42:18
【问题描述】:

我正在为一个开源项目构建一个基本的分析器。一个要求是测量方法的执行时间。虽然这很容易,但我必须在运行时之前不知道方法或其包含类的情况下这样做。调用探查器的方法是用户从活动文档中的 IDE 调用探查器。因此,如果 class1 是打开的,并且用户右键单击文档中的空白处,选择配置文件,那么,只有这样,这个类才是已知的。

我有这段代码可以使用 MethodInfo:

MethodInfo methodInfo = typeof(t).GetMethod(s);

T 只是一个泛型类型持有者(类 X,其中 T : 类,是类签名)。 s 只是方法名称的字符串。

但是我有这个错误:

需要类型名称,但找到了参数名称。

该代码行的包含方法将 t 作为类型 T 的参数,但将其移出并不能解决问题。 T 只是一个对象,如果我提供一个对象名,比如类名,就没有错误。

什么给了?

编辑:也许激活器可以解决这个问题。

另外,我可以使用 where 子句将 T 限制为仅是静态类吗?

谢谢

【问题讨论】:

  • 你能说明包含那行代码的方法是如何被调用的吗?

标签: c# .net reflection


【解决方案1】:

错误是因为 typeof 需要一个类型名称或参数,如 typeof(int) 或 typeof(T),其中 T 是一个类型参数。看起来 t 是 System.Type 的一个实例,所以不需要 typeof。

你需要一个泛型类型吗?这行不通吗?

public void DoSomething(object obj, string methodName)
{
  MethodInfo method = obj.GetType().GetMethod(methodName);
  // Do stuff
}

public void DoSomething(Type t, string methodName)
{
  MethodInfo method = t.GetMethod(methodName);
  // Do stuff
}

此外,没有办法将类型参数限制为静态类。我不确定这有什么用,因为您不能拥有它的实例,并且它无法实现您可以在泛型方法中使用的任何接口。

【讨论】:

    【解决方案2】:

    也许你需要

    t.GetType().GetMethod(s)
    

    【讨论】:

      【解决方案3】:
      public void DoSomething(object obj, string methodName)
      {
        MethodInfo method = obj.GetType().GetMethod(methodName);
        // Do stuff
      }
      

      这已经成功了(与上面的 2 个帖子相同)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多