130

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 メソッドを呼び出したいと思います。

4

4 に答える 4

169

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);
于 2012-08-10T19:39:27.470 に答える