2009-04-24 21 views
12

Sto chiamando un metodo statico su un oggetto utilizzando la riflessione:Come si passano i parametri per riferimento quando si chiama un metodo statico utilizzando la riflessione?

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

Come passate parametri ref, piuttosto che per valore? Presumo che sarebbero di valore per impostazione predefinita. Il primo parametro ("Parametro1" nell'array) dovrebbe essere di riferimento, ma non riesco a capire come passare in questo modo.

risposta

16

Per un parametro di riferimento (o fuori in C#), la riflessione copierà il nuovo valore nell'array di oggetti nella stessa posizione del parametro originale. È possibile accedere a quel valore per vedere il riferimento modificato.

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

Se si chiama Type.GetMethod e utilizzare il BindingFlag di appena BindingFlags.Static, non troverà il metodo. Rimuovere la bandiera o aggiungere BindingFlags.Public e troverà il metodo statico.

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

Hai ragione. Grazie. Non è la fonte del mio problema originale, ma ancora un problema. – Deane

Problemi correlati