2009-04-24 19 views
12

Voy a llamar a un método estático en un objeto utilizando la reflexión:¿Cómo se pasan los parámetros por ref cuando se llama a un método estático mediante la reflexión?

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

¿Cómo pasar parámetros por referencia, más bien que por el valor? Supongo que serían por valor por defecto. El primer parámetro ("Parameter1" en la matriz) debe ser por ref, pero no puedo entender cómo pasarlo de esa manera.

Respuesta

16

Para un parámetro de referencia (o salida en C#), la reflexión copiará el nuevo valor en la matriz de objetos en la misma posición que el parámetro original. Puede acceder a ese valor para ver la referencia modificada.

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 llama Type.GetMethod y utiliza el BindingFlag de poco BindingFlags.Static, no va a encontrar su método. Quite la bandera o agregue BindingFlags.Public y encontrará el método estático.

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

Tienes razón. Gracias. No es la fuente de mi problema original, pero sigue siendo un problema. – Deane

Cuestiones relacionadas