A postagem original foi postada na GCDN Como a GCDN fez ajustes de integração e agora está focada em trocas de produtos e outros motivos, o blog da GCDN foi fechado, então tive que mover alguns itens úteis para cá.
13 de agosto de 2009 12h29 piscando
Escrevendo este blog, CyljXu me fez uma pergunta hoje: Como chamar um método com parâmetros ref ou out através de reflexão? Pensando que outras pessoas possam encontrar esse problema, gostaria de registrá-lo para que futuros leitores possam pesquisar.
Isso é explicado no MSDN, consulte o método MethodBase.Invoke.
invocação de objeto público (objeto de objeto, parâmetros de objeto [])
Visual C++
público
: Objeto virtual^ Invoke( Objeto^ obj, arrayJ#
público
Invocação final do objeto (Object obj, parâmetros Object[])
JScript
público
final
função
Invocar (obj: Objeto, parâmetros: Objeto []): Objeto
parâmetro
obj Tipo: System.Object
O objeto no qual os métodos ou construtores são chamados. Se o método for estático, este parâmetro será ignorado. Se o construtor for estático, esse parâmetro deverá ser uma referência nula (Nothing no Visual Basic) ou uma instância da classe na qual o construtor está definido.
tipo de parâmetro: System.Object[]
A lista de parâmetros do método ou construtor a ser chamado. Esta é uma matriz de objetos que possuem o mesmo número, ordem e tipo dos parâmetros do método ou construtor que está sendo chamado. Se não houver parâmetros, os parâmetros deverão ser uma referência nula (Nothing no Visual Basic).
Se o método ou construtor representado por esta instância usar um parâmetro ref (ByRef em Visual Basic), o parâmetro não exigirá nenhum atributo especial quando esta função for usada para chamar o método ou construtor. Se um objeto na matriz não for inicializado explicitamente com um valor, o objeto conterá o valor padrão para esse tipo de objeto. Para elementos do tipo de referência, o valor é null Reference (Nothing em Visual Basic). Para elementos do tipo de valor, o valor é 0, 0,0 ou falso, dependendo do tipo de elemento específico.
Então, como chamar e tratar o valor passado? Por favor, veja o seguinte exemplo:
1 classe Programa 2 { 3 static void Main(string[] args) 4 { 5 string content = "main"; //#1 variável 6 MethodInfo testMethod = typeof(Program).GetMethod("TestMethod", 7 BindingFlags.Static | BindingFlags.NonPublic); 8 if (testMethod != null) 9 {10 // O caminho a seguir não pode recuperar o conteúdo.11 // --------------------- ----------------12 testMethod.Invoke(null, new object[] { content /* #1 variável */ });13 Console.WriteLine(content); 1 variável, a saída é: main14 // ----------------------------------------- ----15 16 17 object [] invocaArgs = new object[] { content /* #1 variável */ };18 testMethod.Invoke(null, invocaArgs);19 content = (string)invokeArgs[0]; Variável nº 2, ignorar a invocação, definida como content.20 Console.WriteLine(content); // variável nº 2, a saída é: test21 }22 }23 24 static void TestMethod(ref string arg)25 {26 arg = "test "; // Variável nº 2, quero ignorar o processo principal.27 }28 }
Ser o apóstrofo que transformou “Impossível” em “Sou possível”
-------------------------------------------------- --
Blog do WinkingZhang ( http://winkingzhang.cnblogs.com )
GCDN ( http://gcdn.grapecity.com/cs )
-