2009-08-31 12 views

risposta

33
public delegate bool Foo(DateTime timestamp); 

Questo è come dichiarare un delegato con la firma che descrivi. Tutti i delegati sono potenzialmente multicast, richiedono semplicemente l'inizializzazione. Come ad esempio:

public bool IsGreaterThanNow(DateTime timestamp) 
{ 
    return DateTime.Now < timestamp; 
} 

public bool IsLessThanNow(DateTime timestamp) 
{ 
    return DateTime.Now > timestamp; 
} 

Foo f1 = IsGreaterThanNow; 
Foo f2 = IsLessThanNow; 
Foo fAll = f1 + f2; 

Calling fAll, in questo caso sarebbe chiamare sia IsGreaterThanNow() e IsLessThanNow().

Ciò che non funziona è l'accesso a ciascun valore restituito. Tutto ciò che ottieni è l'ultimo valore restituito. Se si desidera recuperare tutti e di ogni valore, dovrete gestire manualmente il multicasting in questo modo:

List<bool> returnValues = new List<bool>(); 
foreach(Foo f in fAll.GetInvocationList()) 
{ 
    returnValues.Add(f(timestamp)); 
} 
2
class Test 
{ 
    public delegate bool Sample(DateTime dt); 
    static void Main() 
    { 
     Sample j = A; 
     j += B; 
     j(DateTime.Now); 

    } 
    static bool A(DateTime d) 
    { 
     Console.WriteLine(d); 
     return true; 
    } 
    static bool B(DateTime d) 
    { 
     Console.WriteLine(d); 
     return true; 
    } 
} 
3

Qualunque delegato può essere un delegato multicast

delegate bool myDel(DateTime s); 
myDel s = someFunc; 
s += someOtherFunc; 

msdn

Una proprietà utile delega oggetti è che possono essere assegnati ad uno delegato istanza per essere multicast utilizzando l'operatore +. Un delegato composto chiama i due delegati da cui è stato composto . Solo i delegati di possono essere composti dallo stesso tipo.

EDIT: Un delagate ha un metodo GetInvocationList che restituisce un elenco con i metodi associati.

Ecco un riferimento su Delegate invocation

foreach(myDel d in s.GetInvocationList()) 
{ 
    d(); 
} 
+2

Cosa succede ai valori di ritorno di un delegato composto quando lo si invoca? C'è una sorta di array che ti permette di ispezionare i valori di ritorno dopo che sono stati chiamati? Ho usato delegati multicast in precedenza, ma non ho mai pensato che avessero un tipo di ritorno. – AaronLS

0

stavo inciampo sullo stesso problema. Ho cercato e trovato questo in msdn.

http://msdn.microsoft.com/en-us/library/2e08f6yc(v=VS.100).aspx

Ci sono due metodi su delegati

  • BeginInvoke
  • EndInvoke

Il link descrive questi in dettaglio, con esempi di codice.

È possibile collegare questi metodi per gestire i valori di ritorno dei delegati.