2008-10-15 6 views
5

Je donne les résultats suivants:Invoquer une méthode utilisant la réflexion sur un objet singleton

public class Singleton 
{ 

    private Singleton(){} 

    public static readonly Singleton instance = new Singleton(); 

    public string DoSomething(){ ... } 

    public string DoSomethingElse(){ ... } 

} 

RÉFLEXION comment puis-je appeler la méthode DoSomething?

Raison Je demande parce que je stocke les noms de méthode en XML et créer de manière dynamique l'interface utilisateur. Par exemple, je crée dynamiquement un bouton et je lui dis quelle méthode appeler par réflexion quand on clique sur le bouton. Dans certains cas, ce serait DoSomething ou dans d'autres, DoSomethingElse.

Répondre

11

Untested, mais devrait fonctionner ...

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); 
+0

grande merci. Ça marche. Sauf n'a pas pu trouver Types.Empty. Voulez-vous dire Type.EmptyTypes? – Crippeoblade

4

excellent travail. Merci.

Voici la même approche avec une légère modification pour les cas où l'on ne peut pas faire référence à l'assemblage à distance. Nous avons juste besoin de connaître des choses de base telles que le nom complet de la classe (par exemple namespace.classname et le chemin vers l'assembly distant).

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);} 
Questions connexes