La publicación original se publicó en GCDN. Dado que GCDN realizó ajustes de integración y ahora se enfoca en intercambios de productos y otras razones, el blog de GCDN se cerró, por lo que tuve que mover algunos útiles aquí.
13 de agosto de 2009 12:29 guiñando un ojo
Al escribir este blog, CyljXu me hizo una pregunta hoy: ¿Cómo llamar a un método con parámetros ref o out mediante reflexión? Pensando que otros podrían encontrar este problema, me gustaría registrarlo para que lo busquen futuros lectores.
Esto se explica en MSDN; consulte el método MethodBase.Invoke.
Invocación de objeto público (obj. de objeto, parámetros de objeto [])
VisualC++
público
: Objeto virtual^ Invocar( Objeto^ obj, matrizJ#
público
Invocación final de objeto (objeto objeto, parámetros objeto[])
jscript
público
final
función
Invocar (obj: Objeto, parámetros: Objeto[]): Objeto
parámetro
Tipo de objeto: Sistema.Objeto
El objeto sobre el que se llaman los métodos o constructores. Si el método es estático, este parámetro se ignora. Si el constructor es estático, este parámetro debe ser una referencia nula (Nada en Visual Basic) o una instancia de la clase en la que está definido el constructor.
tipo de parámetros: System.Object[]
La lista de parámetros del método o constructor que se llamará. Se trata de una matriz de objetos que tienen el mismo número, orden y tipo que los parámetros del método o constructor que se llama. Si no hay parámetros, los parámetros deben ser una referencia nula (Nada en Visual Basic).
Si el método o constructor representado por esta instancia toma un parámetro ref (ByRef en Visual Basic), el parámetro no requiere ningún atributo especial cuando esta función se usa para llamar al método o constructor. Si un objeto en la matriz no se inicializa explícitamente con un valor, el objeto contendrá el valor predeterminado para ese tipo de objeto. Para elementos de tipo de referencia, el valor es Referencia nula (Nada en Visual Basic). Para elementos de tipo de valor, el valor es 0, 0,0 o falso, según el tipo de elemento específico.
Entonces, ¿cómo llamar y manejar el valor pasado? Consulte el siguiente ejemplo:
1 clase Programa 2 { 3 static void Main(string[] args) 4 { 5 string content = "main"; //#1 variable 6 MethodInfo testMethod = typeof(Program).GetMethod("TestMethod", 7 BindingFlags.Static | BindingFlags.NonPublic); 8 if (testMethod! = null) 9 {10 // El siguiente método no puede recuperar el contenido.11 // --------------------- ----------------12 testMethod.Invoke(null, new object[] { content /* #1 variable */ });13 Console.WriteLine(content // #); 1 variable, la salida es: main14 // ----------------------------------------- ----15 16 17 objeto [] invokeArgs = nuevo objeto[] { contenido /* #1 variable */ };18 testMethod.Invoke(null, invokeArgs);19 contenido = (cadena)invokeArgs[0]; Variable n.° 2, omitir la invocación, establecer en contenido.20 Console.WriteLine(content); // variable n.° 2, la salida es: test21 }22 }23 24 static void TestMethod(ref string arg)25 {26 arg = "test "; // variable #2, quiero pasar al proceso principal.27 }28 }
Ser el apóstrofo que cambió “Imposible” por “Soy posible”
-------------------------------------------------- --
Blog de WinkingZhang ( http://winkingzhang.cnblogs.com )
GCDN ( http://gcdn.grapecity.com/cs )
-