0

我有一个方法的名称:“Garden.Plugins.Code.Beta.Business.CalculateRest”

如何运行它?我想到了这个基于反射的奇特解决方案,例如 RunMethod(string MethodName)

4

4 回答 4

3
  • 通过在最后一个点上拆分将其拆分为类型名称和方法名称
  • 使用Type.GetTypeAssembly.GetType获取类型。(Type.GetType 只会在当前执行的程序集和 mscorlib 中查找,除非您在参数中指定程序集名称。)
  • 使用Type.GetMethod从类型中获取方法。假设它是一个公共静态方法,请指定BindingFlags.Public | BindingFlags.Static.
  • 通过调用MethodInfo.Invoke (null, null) 来执行方法。(第一个 null 指定“无目标” - 即它是一个静态方法;第二个指定没有参数。)

如果你想调用一个实例方法或一个带参数的方法,你也需要弄清楚如何获取这些信息。

于 2008-12-02T11:19:03.753 回答
2

这并不像将最后一个点左侧的所有内容都视为文字类型名那么简单。如果您有一种类型的表格:

XYZ型

那么 X、Y 和 Z 不一定是命名空间。它们本身也可以是类型,后续部分可以是内部类:

class X
{
  class Y
  {
   // etc
  }
}

如果是这种情况,则 Type.GetType("X.YU") 不会解析为 Y 类。相反,clr 用 + 符号分隔内部类,因此您实际上需要调用 Type.GetType("X+ Y");

如果您调用的方法是params方法,那么您需要做一些额外的工作。您需要将变量参数向上滚动到一个数组中并传递它。您可以通过获取方法的ParameterInfo数据并查看最后一个参数是否附加了ParamArray属性来检查可变参数。

于 2008-12-02T12:12:58.107 回答
1

它会很慢,相信我。所以不要把它放在关键的地方。

除此之外,您只需要“手动”完成。开始枚举所有命名空间、类等,直到找到所需内容。我不认为已经有任何花哨的预制可以做到这一点。(虽然我没搜过)

于 2008-12-02T11:14:02.517 回答
1

如果类型是实例类型:

Type.GetType("Garden.Plugins.Code.Beta.Business")
    .GetMethod("CalculateRest").Invoke(myInstanceOfTheType, param1, param2);

如果是静态方法:

Type.GetType("Garden.Plugins.Code.Beta.Business")
    .GetMethod("CalculateRest").Invoke(null, param1, param2);

如果它不带参数,就不用“param1, param2, etc”...

于 2008-12-02T11:47:44.587 回答