C# Variable = new function () {};
Au sein de la C# est-il possible de créer une nouvelle fonction à la volée afin de définir une variable?
Je sais que
string getResult() {
if (a)
return "a";
return "b";
}
String result = getResult();
est possible, mais je suis à la recherche de quelque chose comme
String result = new string getResult() {
if (a)
return "a";
return "b";
}
Est-ce possible? Si oui, quelqu'un voudrait-il démontrer?
MODIFIER
Il est possible
Edit: Final - Solution
C'est le résultat final de ce que j'ai barbare de bidouillé
Func<string> getResult = () =>
{
switch (SC.Status)
{
case ServiceControllerStatus.Running:
return "Running";
case ServiceControllerStatus.Stopped:
return "Stopped";
case ServiceControllerStatus.Paused:
return "Paused";
case ServiceControllerStatus.StopPending:
return "Stopping";
case ServiceControllerStatus.StartPending:
return "Starting";
default:
return "Status Changing";
}
};
TrayIcon.Text = "Service Status - " + getResult();
OriginalL'auteur TheeRFG | 2012-08-26
Vous devez vous connecter pour publier un commentaire.
Une façon de définir une telle fonction:
Vous pouvez ensuite appeler:
string foo = getResult( true );
. En tant que délégué, il peut être stockée ou transmise et invoquée en cas de besoin.Exemple:
Vous pouvez également fermer autour de variables dans la portée:
Func
s sont généralement utilisés pour, et serait source de confusion pour les futurs lecteurs de votre code (vous inclus) qui sont plus familiers avec la normaleFunc
les habitudes d'utilisation. Sauf si c'est vraiment un cas où unFunc
ouAction
aurait plus de sens, soit insérer le code, ou en faire une méthode distincte.J'aurais pas d'accord. Alors que je ne sais pas ce que l'OP a des besoins, et c'est un exemple artificiel, la capacité à définir et à plusieurs reprises/conditionnel/éventuellement exécuter un délégué est à la fois puissant et commune. Mais c'est juste moi.
Ce ne serait pas vraiment pour moi comme Tim S. déclaré. Je préfère simplement la définir dans une autre méthode, si je devais utiliser cette route. Mon seul but en faisant cela était de définir paresseux style dans une ligne comme Actionscript, ou ce que je crois est également possible dans Javo. Sur la réalisation, il pourrait être plus difficile que j'ai d'abord l'intention, j'étais curieux de voir comment il pourrait être mis en œuvre, si elle a effectivement pu être mis en œuvre.
Vous pouvez définir un délégué dans une ligne, mais ce n'est probablement pas la bonne personne si c'est la seule motivation pour elle.
La méthode initiale mentionnée aurait travaillé, avait je voulais passer le ServiceController (l'objet de mon switch est construit autour dans le contexte), chaque appel à getResult. "getResult(ServiceController);" aurait fonctionné, mais je ne voulais pas que et regarder cette partie de votre réponse m'a jeté. Je vois maintenant où vous l'avez dit vous pouvez fermer autour de variables dans la portée. C'est en fait exactement ce que je cherchais. Désolé de ne pas l'avoir remarqué plus tôt.
OriginalL'auteur Tim Medora
Vous souhaitez utiliser la ligne si l'instruction.
vous pourriez le faire avec un
Dictionary
.Un
Dictionary
engage beaucoup plus de ressources qu'un simple instruction switch (relativement parlant). En général, vous devriez essayer d'éviter d'utiliser des Dictionnaires pour la logique connue au moment de la compilation.OriginalL'auteur Daniel A. White
Si vous voulez vraiment inline, vous pouvez faire une extension de la méthode de type
String
:Et puis, quand vous voulez l'utiliser, vous le faites comme suit:
OriginalL'auteur James
Pas sûr de ce que la portée de la variable
a
est dans votre exemple, mais en supposant qu'elle est accessible dans le champ d'application (comme dans votre exemple):Action<T>
s ne retourne rien a direFunc<string>
? De toute façon, je pense quevar
serait probablement travailler...oui mise à jour de grâce.
ne fonctionne pas avec les lambdas. Il n'y a pas assez de contexte pour le compilateur de savoir quoi faire de lui. (l'erreur de compilation est "Impossible d'assigner une expression lambda à une implicitement de type de la variable locale")
Vous pensez que ça pourrait intelligemment déterminer le type de retour. Oh bien.
la racine de la raison (ou alors je déduis), c'est que
Func
etAction
n'ont pas de statut particulier dans le compilateur C# - ils sont délégués. Si vous aviez un délégué défini qui ont la même signature, comment pourrait-il savoir ce que vous souhaiteriez? E. g. même parmi les plus commun intégré délégués,Action<object, EventArgs>
etEventHandler
sont les mêmes.OriginalL'auteur Zaid Masud
Basé sur la solution que vous avez posté, voici une meilleure façon de le faire.
Changer votre ServiceControllerStatus enum pour ajouter [Description] attributs:
Ajouter l'extension suivante de la méthode dans une nouvelle classe statique:
Maintenant, vous pouvez simplement écrire:
OriginalL'auteur Zaid Masud