繁体   English   中英

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

[英]How to run any method knowing only her fully qualified name

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

怎么运行呢? 我考虑过像RunMethod(string MethodName)这样基于花式反射的解决方案

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

如果要调用一个实例方法或一个带有参数的方法,则还需要弄清楚如何获取该信息。

它不像将最后一个点左侧的所有内容都当作文字类型名称那样简单。 如果您具有以下形式的表单:

XYZ类型

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

class X
{
  class Y
  {
   // etc
  }
}

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

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

会慢的,相信我。 因此,请勿将其放在关键位置。

除此之外,您只需要“手工”即可。 开始枚举所有名称空间,类等,直到找到所需的内容。 我不认为已经有任何花哨的预制物可以做到这一点。 (尽管我没有搜索)

如果类型是实例类型:

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等” ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM