2013-07-20 2 views
0

Давайте функцию:Anonymous функция декларации типа

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

Я хочу, чтобы создать сложную функцию, которая использует все эти функции, объявленные выше.

Как это:

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

Дело такое заявление убивает читаемость программе. В этом случае вывод типа не работает.

Вопрос: Могу ли я использовать что-то вроде этого?

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

Я пробовал и отвечаю - нет. Может быть, у кого-нибудь есть другое решение, чтобы сделать краткие сложенные декларации функций?

+4

Это выглядит странно. Последним общим параметром 'Func' является возвращаемый тип. У вас есть три Funcs с тремя различными типами возвращаемых данных, и все же вы пытаетесь объединить их с Func, который берет их первым в качестве ввода и возвращает Func, который выглядит как третий? Что вы на самом деле пытаетесь сделать здесь? –

+1

Не связано с тем, что вы просите, но лямбда '(x) => {return new resultFoo (x);}' (точка с запятой отсутствует в вашем коде!) Может быть немного упрощена до 'x => new resultFoo (x) '. –

+0

Даниил, вы правы, я должен исправить ошибку в примере. –

ответ

1

Вы всегда можете объявить ваш собственный делегат, который будет описывать ваши методы:

public delegate resultMy MyDelegate(argsMy arg) 

и использовать sho rter имя MyDelegate

Func<FooDelagate, BatDelegate, BazDelegate> 

и даже то, что делегат можно назвать, чтобы упростить вам код.

+0

Делегаты хороши в более статическом коде, таком как декларации методов. Но анонимные функции рассчитаны на легкий вес (я полагаю), и использование делегатов в этом случае делает код более надежным, как и раньше. –

+0

@ gleb.kudr - 'Func ' _is_ тип делегата, только тот, который определен в BCL. Вы можете передавать только lambdas или анонимные функции в качестве экземпляров делегата. – Lee

0

Ну, вы могли бы добавить using заявления в верхней части файла, упрощающем что:

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

И тогда вы можете спать просто использовать его как это:

SomeName myFunc = //the func 
+0

В этом случае я могу использовать делегатов. Вопрос в том, как их не использовать :) –

+0

@ gleb.kudr Другим вариантом является отражение, которое сделает его слишком сложным. –

Смежные вопросы