2010-08-27 7 views
1

Je travaille avec System.Func mais j'y suis arrivé avec une pierre d'achoppement.Func pour 5 arguments

System.Func<TReturn> // (no arg, with return value) 
System.Func<T, TReturn> // (1 arg, with return value) 
System.Func<T1, T2, TReturn> // (2 arg, with return value) 
System.Func<T1, T2, T3, TReturn> // (3 arg, with return value) 
System.Func<T1, T2, T3, T4, TReturn> // (4 arg, with return value) 

Le maximum qu'il accepte est de 4 arguments.

Existe-t-il un moyen d'étendre ceci à 5 arguments?

Répondre

5

Vous avez quelques options un est de définir le délégué de votre auto qui ressemblerait à ceci:

public delegate TResult Func<T1,T2,...,TN,TResult>(T1 arg1, T2 arg2,...,TN argN); 

vous pouvez définir essentiellement pour un certain nombre d'arguments (supérieur à 4 puisque vous pourriez obtenir un choc de nom sinon)

ou vous pouvez envelopper vos arguments dans une structure de sorte que vous puissiez utiliser l'un des délégués Func déjà définis pour vous.

Dans tous les cas, vous devez vous inquiéter de la signature de la méthode si vous ne pouvez pas utiliser l'un des délégués Func prédéfinis. Des listes de paramètres assez souvent longues sont une odeur qui vous amène souvent à réaliser que la méthode est en train de faire beaucoup (sans rapport) de travail.

Mon approche personnelle serait donc de savoir où la conception a échoué et corriger au lieu de corriger ce qui est le plus souvent le symptôme (dans ce cas, la définition d'un Func avec agruments suffisamment pourrait être fixer le symptôme ne dis pas qu'il est depuis que je ne connais pas votre code)

9

Placez-vous dans une version supérieure du framework .NET. Par exemple. NET 4.0 a jusqu'à 16

http://msdn.microsoft.com/en-us/library/yxcx7skw.aspx

alors 3.5 a seulement 4

http://msdn.microsoft.com/en-us/library/yxcx7skw(v=VS.90).aspx

Ou, si vous coincé dans une version inférieure, il suffit de définir le délégué vous.

+0

Merci pour votre aide Brian. Je suis coincé dans .net 3.5 et ne peux pas améliorer. Pourriez-vous m'aider à définir moi-même un délégué, car je ne suis pas trop familier avec cela? Votre aide serait appréciée. – amateur

+0

La syntaxe est dans les documents: http://msdn.microsoft.com/en-us/library/bb534303(v=VS.90).aspx – Brian

+2

@Niall: La syntaxe dont vous avez besoin serait 'public delegate TResult Func < T1, T2, T3, T4, T5, TResult> (T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5); etc. – LukeH

1

je suppose, il est possible de voir l'action et Func au moins avec 25 paramètres dans le cadre 5.0 :)

Il n'y a aucune raison de passer à la version cadre supérieur parce que je ne peux pas refactore mon code valide, vue maintenable. Vraiment, ce n'est pas une bonne pratique d'utiliser autant de paramètres dans la signature de la méthode. Utilisez l'entité qui a 5 champs ou propriétés. Vous pouvez dépenser cette entité sans modifier la signature de la méthode ou de la fonction.