Func<> avec un nombre indéterminé de paramètres
Considérer le pseudo-code suivant:
TResult Foo<TResult>(Func<T1, T2,...,Tn, TResult> f, params object[] args)
{
TResult result = f(args);
return result;
}
La fonction accepte Func<>
avec un nombre indéterminé de paramètres génériques et une liste des arguments correspondants. Est-il possible de l'écrire en C#? Comment définir et appeler Foo
? Comment puis-je passer args
à f
?
Malheureusement pas possible 🙁 Vous pouvez le faire via
Delegate
et l'utilisation de la réflexion, mais je suis sûr que c'est pas ce que vous voulez.OriginalL'auteur user2341923 | 2014-04-03
Vous devez vous connecter pour publier un commentaire.
Ce n'est pas possible. Au mieux, vous pourriez avoir un délégué qui prend un nombre variable d'arguments, et puis avoir délégué à analyser les arguments
OriginalL'auteur dcastro
Vous pouvez utiliser
Delegate
avecDynamicInvoke
.Avec ça, vous n'avez pas besoin de gérer avec
object[]
dansf
.Utilisation:
J'ai créé un violon montrant quelques exemples: https://dotnetfiddle.net/LdmOqo
Remarque:
Si vous souhaitez utiliser un
method group
, vous devez utiliser un explicit casting pourFunc
:Violon: https://dotnetfiddle.net/3ZPLsY
DynamicInvoke
refléter le Tableau comme délimité par des virgules des paramètres dans les méthodes d'exécution?Oui @GoldBishop.
DynamicInvoke
est exactement ce que fait. Dans ce violon je vous montre quelques exemples. Vérifier la doc msdn DynamicInvoke pour plus d'informations.hmmmm...le mal qui peut être fait avec une telle connaissance 🙂
Bon point @yoyo. Pour utiliser cette fonction avec la méthode de groupe, vous devez utiliser explicit casting. J'ai créé un autre violon montrant comment vous pouvez faire ceci: dotnetfiddle.net/qVlt47 je vais mettre à jour mon awnser l'expliquer. Merci pour les commentaires!
Merci pour la mise à jour, et le violon (dotNetFiddle est grand!) J'ai essayé de trouver un moyen de manipulation arbitraire de paramètres sans avoir à indiquer les types de paramètres sur le site d'appel, mais j'ai décidé de trouver une autre façon de résoudre mon problème. (BTW,
Method("yoyo", 22)
certainement renvoie faux! 😉OriginalL'auteur Renan Araújo
Dans certains cas, vous pouvez être en mesure de sortir avec un truc comme ceci:
OriginalL'auteur DDRider62
Vous pouvez essayer quelque chose de semblable à ce que j'ai posté ici: https://stackoverflow.com/a/47556051/4681344
Elle permettra de disposer d'un nombre quelconque d'arguments, et applique leurs types.
de l'appeler, tout simplement...
OriginalL'auteur Bryan Clark