Come passare un parametro come riferimento con MethodInfo.Invoke

Come posso passare un parametro come riferimento con MethodInfo.Invoke ?

Questo è il metodo che voglio chiamare:

 private static bool test(string str, out byte[] byt) 

Ho provato questo, ma ho fallito:

 byte[] rawAsm = new byte[]{}; MethodInfo _lf = asm.GetTypes()[0].GetMethod("test", BindingFlags.Static | BindingFlags.NonPublic); bool b = (bool)_lf.Invoke(null, new object[] { "test", rawAsm }); 

I byte restituiti sono nulli.

È necessario prima creare l’array di argomenti e mantenere un riferimento ad esso. Il valore del parametro out verrà quindi memorizzato nell’array. Quindi puoi usare:

 object[] arguments = new object[] { "test", null }; MethodInfo method = ...; bool b = (bool) method.Invoke(null, arguments); byte[] rawAsm = (byte[]) arguments[1]; 

Nota come non è necessario fornire il valore per il secondo argomento, perché è un parametro out – il valore verrà impostato dal metodo. Se fosse un parametro ref (invece che out ), verrà usato il valore iniziale – ma il valore dell’array potrebbe ancora essere sostituito dal metodo.

Campione breve ma completo:

 using System; using System.Reflection; class Test { static void Main() { object[] arguments = new object[1]; MethodInfo method = typeof(Test).GetMethod("SampleMethod"); method.Invoke(null, arguments); Console.WriteLine(arguments[0]); // Prints Hello } public static void SampleMethod(out string text) { text = "Hello"; } } 

Quando un metodo invocato da reflection ha un parametro ref , verrà ricopiato nell’array utilizzato come elenco di argomenti. Quindi, per ottenere il riferimento del copiato, è sufficiente consultare l’array usato come argomento.

 object[] args = new [] { "test", rawAsm }; bool b = (bool)_lf.Invoke(null, args); 

Dopo questa chiamata, args[1] avrà il nuovo byte[]