2009-04-24 8 views
12

J'appelle une méthode statique sur un objet en utilisant la réflexion:Comment passez-vous les paramètres par ref lorsque vous appelez une méthode statique en utilisant la réflexion?

MyType.GetMethod("MyMethod", BindingFlags.Static).Invoke(null, new object[] { Parameter1, Parameter2 }); 

Comment passez-vous les paramètres par référence, plutôt que par la valeur? Je suppose qu'ils seraient en valeur par défaut. Le premier paramètre ("Parameter1" dans le tableau) devrait être par ref, mais je ne peux pas comprendre comment le passer de cette façon.

Répondre

16

Pour un paramètre de référence (ou en C#), la réflexion copie la nouvelle valeur dans le tableau d'objets à la même position que le paramètre d'origine. Vous pouvez accéder à cette valeur pour voir la référence modifiée.

public class Example { 
    public static void Foo(ref string name) { 
    name = "foo"; 
    } 
    public static void Test() { 
    var p = new object[1]; 
    var info = typeof(Example).GetMethod("Foo"); 
    info.Invoke(null, p); 
    var returned = (string)(p[0]); // will be "foo" 
    } 
} 
1

Si vous appelez Type.GetMethod et utilisez le BindingFlag de seulement BindingFlags.Static, il ne trouvera pas votre méthode. Supprimer le drapeau ou ajouter BindingFlags.Public et il trouvera la méthode statique.

public Test { public static void TestMethod(int num, ref string str) { } } 

typeof(Test).GetMethod("TestMethod"); // works 
typeof(Test).GetMethod("TestMethod", BindingFlags.Static); // doesn't work 
typeof(Test).GetMethod("TestMethod", BindingFlags.Static 
            | BindingFlags.Public); // works 
+0

Vous avez raison. Merci. Pas la source de mon problème d'origine, mais toujours un problème. – Deane

Questions connexes