如何运行任何只知道她的完全限定名称的方法

时间:2008-12-02 11:11:18

标签: c# reflection methods

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

如何运行它?我想到了像RunMethod(string MethodName)

这种基于花式反射的解决方案

4 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

将最后一个点左边的所有内容视为文字类型名称并不简单。如果你有一种形式:

X.Y.Z.Type

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

class X
{
  class Y
  {
   // etc
  }
}

如果是这种情况,那么Type.GetType(“X.YU”)将不会解析为Y类。相反,clr用+符号分隔内部类,所以你实际上需要调用Type.GetType( “X + Y”);

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

答案 2 :(得分:1)

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

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

答案 3 :(得分: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等”......