2013-07-20 4 views
0

Ayons une fonction:déclaration de fonction de type

Func<argsFoo, resultFoo> foo= x=>new resultFoo(x); 
Func<argsBar, resultBar> bar= x=>new resultBar(x); 
Func<argsBaz, resultBaz> baz= x=>new resultBaz(x); 

Je veux créer une fonction complexe qui utilise toutes ces fonctions mentionnées ci-dessus.

Comme ceci:

Func 
< 
    Func<argsFoo, resultFoo>, 
    Func<argsBar, resultBar>, 
    Func<argsBaz,resultBaz>, 
    fooBarBazResult 
> fooBarBaz=... 

Le point est une telle déclaration est en train de tuer la lisibilité du Programme. L'inférence de type ne fonctionne pas dans ce cas.

Question: Puis-je utiliser quelque chose comme ça?

FooBarBaz<typeof(foo),typeof(bar)>,typeof(baz)>> 

J'ai essayé et la réponse est non. Peut-être que quelqu'un a une autre solution pour raccourcir les déclarations de fonction composées?

+4

Cela semble étrange. Le dernier paramètre générique d'un 'Func' est le type de retour. Vous avez trois Funcs avec trois types de retour différents et encore, vous essayez de les combiner avec un Func qui prend le premier à en entrée et retourne un Func qui ressemble à la troisième? Qu'est-ce que vous essayez vraiment de faire ici? –

+1

Pas lié à ce que vous demandez mais le lambda '(x) => {return newFool (x);}' (point-virgule manquant dans votre code!) Peut être simplifié un peu, 'x => new resultFoo (x) '. –

+0

Daniel tu as raison je devrais corriger l'erreur dans l'exemple. –

Répondre

1

Vous pouvez toujours déclarer votre propre délégué qui décrira vos méthodes:

public delegate resultMy MyDelegate(argsMy arg) 

et d'utiliser le sho le nom rter MyDelegate

Func<FooDelagate, BatDelegate, BazDelegate> 

et même que délégué, vous pouvez vous nommer simplifier le code.

+0

Les délégués sont bons dans un code plus statique, comme les déclarations de méthode. Mais les fonctions anonymes sont conçues pour être légères (je suppose) et l'utilisation de délégués dans ce cas rend le code plus robuste qu'il l'était. –

+0

@ gleb.kudr - 'Func ' _is_ un type de délégué, un seul qui est défini dans la BCL. Vous ne pouvez transmettre des fonctions lambdas ou anonymes qu'en tant qu'instances de délégué. – Lee

0

Eh bien, vous pouvez ajouter une déclaration using en haut de votre fichier qui permet de simplifier que:

using SomeName = Func<Func<ArgsFoo, ResultFoo>, Func<ArgsBar, ResultBar>, Func<ArgsBaz, ResultBaz>>; 

Et vous Couls utilisez simplement comme ceci:

SomeName myFunc = //the func 
+0

Sur ce cas, je peux utiliser des délégués. La question est de savoir comment ne pas les utiliser :) –

+0

@ gleb.kudr L'autre option est la réflexion, ce qui la rendrait beaucoup trop complexe. –