Passer de la Méthode en Paramètre à l'aide de C#
J'ai plusieurs méthodes de tous avec la même signature (paramètres et valeurs de retour), mais des noms différents et le fonctionnement interne de l'méthodes sont différentes. Je veux passer le nom de la méthode à exécuter à une autre méthode qui vous permettra d'invoquer le passé dans la méthode.
public int Method1(string)
{
... do something
return myInt;
}
public int Method2(string)
{
... do something different
return myInt;
}
public bool RunTheMethod([Method Name passed in here] myMethodName)
{
... do stuff
int i = myMethodName("My String");
... do more stuff
return true;
}
public bool Test()
{
return RunTheMethod(Method1);
}
Ce code ne fonctionne pas, mais c'est ce que je suis en train de faire. Ce que je ne comprends pas, c'est comment écrire le RunTheMethod code car j'ai besoin de définir le paramètre.
- Pourquoi ne pas passer un délégué à la place du nom de la méthode?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser la touche Func délégué .net 3.5 en tant que paramètre dans votre RunTheMethod méthode. Le délégué Func permet de spécifier une méthode qui prend un certain nombre de paramètres d'un type spécifique et renvoie un seul argument d'un type spécifique. Voici un exemple qui devrait fonctionner:
Action
au lieu deFunc<string, int>
.Action<int,string>
correspond à une méthode qui prend 2 paramètres (int et string) et le retour de vide.Func<double,string,int>
correspond à une méthode qui prend 2 paramètres (double
etstring
) et le retourint
. Spécifié en dernier type est le type de retour. Vous pouvez utiliser ce délégué pour jusqu'à 16 paramètres. Si vous aviez besoin de plus, écrire votre propre déléguépublic delegate TResult Func<in T1, in T2, (as many arguments as you want), in Tn, out TResult>(T1 arg1, T2 arg2, ..., Tn argn);
. Veuillez me corriger si j'ai mal compris.Int.Parse
Vous devez utiliser un délégué. Dans ce cas, toutes vos méthodes prennent un
string
paramètre et retourne unint
- ce n'est plus simplement représentée par leFunc<string, int>
délégué1. Ainsi, votre code peut devenir correcte avec d'aussi simple qu'un changement comme celui-ci:Délégués ont beaucoup plus de pouvoir que cela, certes. Par exemple, avec le C#, vous pouvez créer un délégué d'un expression lambda, de sorte que vous pourriez appeler votre méthode de cette façon:
Qui permettra de créer une fonction anonyme comme ceci:
et de passer ensuite que délégué à la
RunTheMethod
méthode.Vous pouvez utiliser les délégués pour les abonnements d'événements, d'exécution asynchrone, rappels - toutes sortes de choses. Il vaut la peine de le lire sur eux, en particulier si vous voulez utiliser LINQ. J'ai un l'article qui est surtout sur les différences entre les délégués et les événements, mais vous trouverez peut-être utile de toute façon.
1 C'est juste, fondée sur le générique
Func<T, TResult>
type de délégué dans le cadre, vous pouvez facilement déclarer votre propre:et puis faire le paramètre de type de
MyDelegateType
à la place.public **delegate** int MyDelegateType(string value)
?Func<T, TResult>
prend unT
et renvoie unTResult
. UnAction
ne pas prendre quoi que ce soit et ne retourne rien.Func<T, TResult>
etAction
, plutôt que le groupes deFunc
etAction
délégués. Mais non, la différence n'est pas sur les entrées - c'est à propos de sorties. LeFunc
les délégués ont tous un type de retour (qui est l'un des paramètres de type). LeAction
délégués sont tousvoid
.De l'OP de l'exemple:
Vous pouvez essayer Délégué Action! Et appeler la méthode à l'aide de
Ou
Puis il suffit d'appeler la méthode
InvokeMethod
lambda appel doit êtreRunTheMethod
au lieuUtilisation:
Vous devez utiliser un
Func<string, int>
délégué, qui représente une fonction prenant unstring
comme argument et retourne unint
:Puis l'utiliser:
Test
méthode doit êtrereturn RunTheMethod(Method1);
Si vous souhaitez la possibilité de changer la méthode qui est appelée au moment de l'exécution, je vous conseille d'utiliser un délégué: http://www.codeproject.com/KB/cs/delegates_step1.aspx
Il va vous permettre de créer un objet pour stocker la méthode à appeler, et vous pouvez passer à tes autres méthodes lorsque cela est nécessaire.
Pour le partage d'une aussi complète que possible de la solution, je vais terminer avec la présentation de trois façons différentes de le faire, mais maintenant, je vais commencer à partir du principe le plus fondamental.
Brève introduction
Tous CLR (Common Language Runtime) langages (comme C# et Visual Basic) travaillent sous une machine virtuelle appelée CLI (Langage Commun Interprète) qui exécute le code sur un niveau plus élevé que les langages comme le C et le C++ (qui directement compiler en code machine). Il en résulte que les méthodes ne sont pas n'importe quel type de compilé bloc, mais ils sont juste des éléments structurés qui CLR reconnaître et d'utiliser de sortir de leur corps et rewing à la ligne d'instructions de la machine code. Ainsi, vous ne pouvez pas penser à passer d'une méthode en tant que paramètre, parce qu'une méthode ne produit pas de valeur par lui-même: ce n'est pas une expression valide! De sorte que, vous allez tomber le délégué concept.
Qu'est ce qu'un délégué?
Un délégué représente un pointeur sur une méthode. Car (comme je l'ai dit ci-dessus), une méthode n'est pas une valeur, il y a une classe spéciale dans le CLR langues:
Delegate
. Cette classe encapsule la méthode, et vous pouvez implicitement convertie en une méthode pour cela.Voici une exemple d'utilisation:
Les trois façons:
Voie 1
Utiliser le
Delegate
classe spéciale directement comme dans l'exemple ci-dessus. Le problème de cette solution est que votre code sera décochée que vous passez dynamiquement vos arguments sans les restreindre les types de personnes dans la déclaration de la méthode.Façon 2/3
En plus de la
Delegate
classe spéciale, les délégués concept se propage à la coutume des délégués, qui sont des déclarations de méthodes précédé par ladelegate
mot-clé et ils se comportent comme une méthode normale. Ils sont donc vérifié, et vous arriverez à un "parfait" du code.Regardez l'exemple suivant:
Une deuxième option, par ce moyen, de ne pas écrire vos propres délégué est l'aide de l'un d'eux a déclaré à l'intérieur du système des bibliothèques:
Action
enroule unevoid
sans arguments.Action<T1>
enroule unevoid
avec un argument.Action<T1, T2>
enroule unevoid
avec deux arguments.Func<TR>
enroule une fonction avecTR
type de retour et sans arguments.Func<T1, TR>
enroule une fonction avecTR
type de retour et avec un argument.Func<T1, T2, TR>
enroule une fonction avecTR
type de retour et avec deux arguments.(Cette dernière solution est que beaucoup de gens affiché.)
Func<T1,T2,TR>
Alors que l'on a accepté la réponse est absolument correcte, je tiens à fournir une méthode supplémentaire.
J'ai atterri ici après avoir fait ma propre recherche d'une solution à une question similaire.
Je suis la construction d'un plugin pilotée-cadre, et dans ce cadre je voulais que les gens à être en mesure d'ajouter des éléments de menu dans le menu des applications pour une liste générique sans s'exposer à une réelle
Menu
objet, parce que le cadre peut déployer sur d'autres plates-formes qui n'ont pasMenu
objets de l'INTERFACE utilisateur. Ajout des informations générales sur le menu est assez facile, mais permet au développeur du plugin assez de liberté pour créer la fonction de rappel lorsque le menu est cliqué, s'avère être une douleur. Jusqu'à ce qu'il m'est apparu que j'étais en train de ré-inventer la roue, et les menus normaux d'appel et de déclencher le rappel des événements!Donc la solution, très simple une fois que vous vous en rendiez compte, m'a échappé jusqu'à maintenant.
Il suffit de créer des classes séparées pour chacun de vos méthodes actuelles, héritées d'une base, si vous devez, et juste ajouter un gestionnaire d'événements pour chaque.
Voici un exemple Qui peut vous aider à mieux comprendre comment passer une fonction en paramètre.
Supposons que vous avez Parent page et vous souhaitez ouvrir un enfant de la fenêtre popup. Dans le parent de la page, il y a une zone de texte qui doit être rempli en se basant sur les enfants popup zone de texte.
Ici, vous devez créer un délégué.
Parent.cs
//déclaration des délégués
public delegate void FillName(String Prenom);
Maintenant créer une fonction qui va remplir la zone de texte et en fonction de la carte délégués
Maintenant sur le bouton cliquez sur vous avez besoin pour ouvrir une Enfant de la fenêtre popup.
DANS ChildPopUp constructeur, vous devez créer un paramètre de "délégué" de parent //page
ChildPopUp.cs
Voici un exemple sans paramètre:
http://en.csharp-online.net/CSharp_FAQ:_How_call_a_method_using_a_name_string
avec params:
http://www.daniweb.com/forums/thread98148.html#
en gros, vous avez un tableau d'objets avec le nom de la méthode. vous pouvez ensuite utiliser à la fois avec la méthode Invoke.
params Object[] paramètres