Le message original a été publié sur GCDN Depuis que GCDN a effectué des ajustements d'intégration et se concentre désormais sur les échanges de produits et d'autres raisons, le blog GCDN a été fermé, j'ai donc dû en déplacer quelques-uns utiles ici.
13 août 2009 12:29 en faisant un clin d'œil
En écrivant ce blog, CyljXu m'a posé une question aujourd'hui : Comment appeler une méthode avec des paramètres ref ou out par réflexion ? Pensant que d'autres pourraient rencontrer ce problème, j'aimerais l'enregistrer pour que les futurs lecteurs puissent le rechercher.
Ceci est expliqué sur MSDN, reportez-vous à la méthode MethodBase.Invoke.
public Object Invoke (Object obj, paramètres Object[])
Visuel C++
publique
: Objet virtuel^ Invoke( Objet^ obj, arrayJ#
publique
Invoke d'objet final (paramètres Object obj, Object [])
JScript
publique
final
fonction
Invoke( obj : Objet, paramètres : Objet[] ) : Objet
paramètre
obj Type : Système.Object
L'objet sur lequel les méthodes ou les constructeurs sont appelés. Si la méthode est statique, ce paramètre est ignoré. Si le constructeur est statique, ce paramètre doit être une référence nulle (Nothing en Visual Basic) ou une instance de la classe dans laquelle le constructeur est défini.
type de paramètres : System.Object[]
La liste des paramètres de la méthode ou du constructeur à appeler. Il s'agit d'un tableau d'objets ayant le même numéro, le même ordre et le même type que les paramètres de la méthode ou du constructeur appelé. S'il n'y a aucun paramètre, les paramètres doivent être une référence nulle (Rien en Visual Basic).
Si la méthode ou le constructeur représenté par cette instance prend un paramètre ref (ByRef dans Visual Basic), le paramètre ne nécessite aucun attribut spécial lorsque cette fonction est utilisée pour appeler la méthode ou le constructeur. Si un objet du tableau n'est pas explicitement initialisé avec une valeur, l'objet contiendra la valeur par défaut pour ce type d'objet. Pour les éléments de type référence, la valeur est null Reference (Nothing en Visual Basic). Pour les éléments de type valeur, la valeur est 0, 0,0 ou false, selon le type d'élément spécifique.
Alors comment appeler et gérer la valeur transmise ? Veuillez consulter l'exemple suivant :
1 classe Programme 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 // La méthode suivante ne peut pas récupérer le contenu.11 // --------------------- ----------------12 testMethod.Invoke(null, new object[] { content /* #1 variable */ });13 Console.WriteLine(content); 1 variable, la sortie est : main14 // ----------------------------------------- ----15 16 17 objet [] invoquéArgs = nouvel objet[] { contenu /* #1 variable */ };18 testMethod.Invoke(null, invoqueArgs);19 contenu = (string)invokeArgs[0]; Variable n°2, contournement de l'invocation, définie sur content.20 Console.WriteLine(content); // Variable n°2, la sortie est : test21 }22 }23 24 static void TestMethod(ref string arg)25 {26 arg = "test "; // Variable n°2, je veux contourner le processus principal.27 }28 }
Être l'apostrophe qui a changé "Impossible" en "Je suis possible"
-------------------------------------------------- --
Blog de WinkingZhang ( http://winkingzhang.cnblogs.com )
GCDN( http://gcdn.grapecity.com/cs )
-