シングルトンオブジェクトのリフレクションを使用してメソッドを呼び出す

StackOverflow https://stackoverflow.com/questions/204468

  •  03-07-2019
  •  | 
  •  

質問

だから私は以下を持っています:

public class Singleton
{

  private Singleton(){}

  public static readonly Singleton instance = new Singleton();

  public string DoSomething(){ ... }

  public string DoSomethingElse(){ ... }

}

リフレクションを使用して、DoSomethingメソッドを呼び出すにはどうすればよいですか?

質問する理由は、メソッド名をXMLに保存し、UIを動的に作成するためです。たとえば、ボタンを動的に作成し、ボタンがクリックされたときにリフレクション経由で呼び出すメソッドを指示しています。場合によってはDoSomethingになり、他の場合にはDoSomethingElseになります。

役に立ちましたか?

解決

テストされていませんが、動作するはずです...

string methodName = "DoSomething"; // e.g. read from XML
MethodInfo method = typeof(Singleton).GetMethod(methodName);
FieldInfo field = typeof(Singleton).GetField("instance",
    BindingFlags.Static | BindingFlags.Public);
object instance = field.GetValue(null);
method.Invoke(instance, Type.EmptyTypes);

他のヒント

すばらしい仕事です。ありがとう。

これは、リモートアセンブリへの参照を持たない場合にわずかな変更を加えた同じアプローチです。クラスのフルネーム(つまり、namespace.classnameとリモートアセンブリへのパス)などの基本的なことを知る必要があるだけです。

static void Main(string[] args)
    {
        Assembly asm = null;
        string assemblyPath = @"C:\works\...\StaticMembers.dll" 
        string classFullname = "StaticMembers.MySingleton";
        string doSomethingMethodName = "DoSomething";
        string doSomethingElseMethodName = "DoSomethingElse";

        asm = Assembly.LoadFrom(assemblyPath);
        if (asm == null)
           throw new FileNotFoundException();


        Type[] types = asm.GetTypes();
        Type theSingletonType = null;
        foreach(Type ty in types)
        {
            if (ty.FullName.Equals(classFullname))
            {
                theSingletonType = ty;
                break;
            }
        }
        if (theSingletonType == null)
        {
            Console.WriteLine("Type was not found!");
            return;
        }
        MethodInfo doSomethingMethodInfo = 
                    theSingletonType.GetMethod(doSomethingMethodName );


        FieldInfo field = theSingletonType.GetField("instance", 
                           BindingFlags.Static | BindingFlags.Public);

        object instance = field.GetValue(null);

        string msg = (string)doSomethingMethodInfo.Invoke(instance, Type.EmptyTypes);

        Console.WriteLine(msg);

        MethodInfo somethingElse  = theSingletonType.GetMethod(
                                       doSomethingElseMethodName );
        msg = (string)doSomethingElse.Invoke(instance, Type.EmptyTypes);
        Console.WriteLine(msg);}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top