一尘不染

用反射调用静态方法

c#

我在命名空间中有几个静态类,mySolution.Macros例如

static class Indent{    
     public static void Run(){
         // implementation
     }
     // other helper methods
}

所以我的问题是,在反射的帮助下如何调用这些方法?

如果方法不是静态的,那么我可以做些类似的事情:

var macroClasses = Assembly.GetExecutingAssembly().GetTypes().Where( x => x.Namespace.ToUpper().Contains("MACRO") );

foreach (var tempClass in macroClasses)
{
   var curInsance = Activator.CreateInstance(tempClass);
   // I know have an instance of a macro and will be able to run it

   // using reflection I will be able to run the method as:
   curInsance.GetType().GetMethod("Run").Invoke(curInsance, null);
}

我想让我的课保持静态。如何使用静态方法执行类似的操作?

简而言之, 我想从名称空间mySolution.Macros中的所有静态类中调用所有Run方法。


阅读 243

收藏
2020-05-19

共1个答案

一尘不染

正如MethodInfo.Invoke文档所述,静态方法将忽略第一个参数,因此您可以仅传递null。

foreach (var tempClass in macroClasses)
{
   // using reflection I will be able to run the method as:
   tempClass.GetMethod("Run").Invoke(null, null);
}

正如注释所指出的那样,您可能需要确保在调用时该方法是静态的GetMethod

tempClass.GetMethod("Run", BindingFlags.Public | BindingFlags.Static).Invoke(null, null);
2020-05-19