2015-01-16 23 views
12

Mi piacerebbe scrivere un metodo che funziona un po 'e restituisce infine un altro metodo con la stessa firma del metodo originale. L'idea è di gestire un flusso di byte in base al valore del byte precedente in sequenza senza andare in ricorsione. Chiamandolo in questo modo:Come si dichiara un Delegato Func che restituisce un Delegato Func dello stesso tipo?

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 
} 

Per passare il metodo, desidero assegnarli a un delegato Func. Ma mi sono imbattuto nel problema che questo si traduce in una dichiarazione ricorsiva senza terminazione ...

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

sto in qualche modo perso qui. Come potrei andare in giro?

risposta

10

Si può semplicemente dichiarare un tipo delegato quando i predefiniti Func<...> delegati non sono sufficienti:

public delegate RecursiveFunc RecursiveFunc(byte input); 

E in caso di necessità, è possibile utilizzare farmaci generici troppo:

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

La firma di il metodo non è noto al momento della compilazione. Non sa che il parametro è un 'byte '. – Servy

+4

@Servy In tal caso ... 'delegate RecursiveFunc RecursiveFunc (input T)' –

+0

eccellente - funziona come un fascino. Nel mio caso so che sarà un Byte, ma +1 per la versione generica. – Marwie