2010-06-27 20 views
10

Ho un controllo utente che si occupa di fileupload. Ho definito un delegato come segueCome dichiarare evento generico per delegato generico in C#

public delegate void FileUploadSuccess<T>(T value,FileUploadType F) 

valore può essere una stringa e matrice di byte. FileUploadType è un enum che indica quale tipo di file è stato caricato.

Ora ho dichiarato un evento in usercontrol per aumentare questo.

public event FileUploadSuccess<string> successString; //In case I want a file name 

public event FileUploadSuccess<Byte[]> successStringImage; // In case I want a byte[] of uploaded image 

Quello che volevo era un evento generico

public event FileUploadSuccess<T> successString. 

risposta

14

se non come parte di tipi generici (cioè

class Foo<T> { public event SomeEventType<T> SomeEventName; } 

) non v'è alcuna cosa come generici proprietà, campi, eventi, indicizzatori o gli operatori (solo tipi generici e metodi generici). Il tipo di contenuto può essere generico?

+0

+1 , una risposta completa. –

4

Per il mondo esterno, un evento per molti versi assomiglia a un campo della classe. Proprio come non è possibile utilizzare un tipo generico aperto per dichiarare un campo, non è possibile utilizzare un tipo generico aperto per dichiarare un evento.

Se è possibile lasciare il tipo aperto, il compilatore dovrà compilare nel gestore eventi aggiungere e rimuovere il codice per ogni tipo possibile per il parametro generico T. Un tipo generico chiuso non può essere compilato JIT, perché il tuo evento non è un tipo a sé stante, piuttosto è una parte di un tipo racchiuso.

0

Non credo sia possibile.

L'evento è come un'istanza di un delegato (in parole povere) e un'istanza è un'implementazione concreta (di una classe generica o non generica).

Per una migliore comprensione dei delegati e dell'evento, è possibile fare riferimento alla discussione this SO.

3

Questo è impossibile se non si definisce il parametro del tipo in una classe di chiusura. Per esempio:

public delegate void FileUploadSuccess<T>(T value, FileUploadType F) 

public class FileUploader<T> 
{ 
    public event FileUploadSuccess<T> FileUploaded; 
} 

Ma questo si muove solo il problema in un altro luogo, dal momento che ora si dovrà dichiarare due istanze della classe FileUploader:

FileUploader<string> stringUploader = new FileUploader<string>(); 
FileUploader<byte[]> stringUploader = new FileUploader<byte[]>(); 

questo potrebbe non essere ciò che si desidera.

1

Perché è necessario un evento generico? Non puoi semplicemente utilizzare un evento normale:

public delegate void FileUploadSuccess(object value); 

e poi

public event FileUploadSuccess Success; 

Nel gestore di eventi di successo si saprà il tipo di oggetto che viene passato:

public void SuccessHandler(object value) 
{ 
    // you know the type of the value being passed here 
} 
+2

Signore, volevo renderlo sicuro e pensavo che i farmaci generici potessero aiutare. – Rohit