我有一个方法的名称:“Garden.Plugins.Code.Beta.Business.CalculateRest”
如何运行它?我想到了这个基于反射的奇特解决方案,例如 RunMethod(string MethodName)
我有一个方法的名称:“Garden.Plugins.Code.Beta.Business.CalculateRest”
如何运行它?我想到了这个基于反射的奇特解决方案,例如 RunMethod(string MethodName)
BindingFlags.Public | BindingFlags.Static
.如果你想调用一个实例方法或一个带参数的方法,你也需要弄清楚如何获取这些信息。
这并不像将最后一个点左侧的所有内容都视为文字类型名那么简单。如果您有一种类型的表格:
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, etc”...