2015-01-16 2 views
12

Я хотел бы написать метод, который выполняет некоторую работу и, наконец, возвращает другой метод с той же сигнатурой, что и исходный метод. Идея состоит в том, чтобы обрабатывать поток байтов в зависимости от предыдущего байтового значения последовательно, не вдаваясь в рекурсию. Называя это так:Как объявить делегат Func, который возвращает делегат Func того же типа?

MyDelegate executeMethod = handleFirstByte //What form should be MyDelegate? 

foreach (Byte myByte in Bytes) 
{ 
    executeMethod = executeMethod(myByte); //does stuff on byte and returns the method to handle the following byte 
} 

Чтобы передать метод, я хочу назначить их делегату Func. Но я столкнулся с проблемой, что это приводит к рекурсивной декларации без прекращения ...

Func<byte, Func<byte, <Func<byte, etc... >>> 

я как-то потерял здесь. Как я мог обойти это?

ответ

10

Вы можете просто объявить тип делегата, когда предопределенные Func<...> делегаты не являются достаточными:

public delegate RecursiveFunc RecursiveFunc(byte input); 

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

public delegate RecursiveFunc<T> RecursiveFunc<T>(T input); 
+0

Подпись однако метод не знает во время компиляции. Он не знает, что параметр является байтом. – Servy

+4

@Servy В этом случае ... 'delegate RecursiveFunc RecursiveFunc (T input)' –

+0

отлично - работает как шарм. В моем случае я знаю, что это будет байт, но +1 для общей версии. – Marwie

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