2010-06-27 48 views
10

我有一個用於處理fileupload的用戶控件。我已經定義了一個代表如下如何在c中爲通用代理聲明泛型事件#

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

值可以是字符串以及字節數組。 FileUploadType是一個枚舉,它告訴上傳哪種類型的文件。

現在我已經在usercontrol中聲明瞭一個事件來提出這個問題。

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 

我想要的東西是一個普通的事件

public event FileUploadSuccess<T> successString. 

回答

14

除通用類型的部分(即

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

)有作爲一般屬性,字段,事件,索引或運營商(僅通用類型和一般方法)沒有這樣的事情。這裏的包含類型是通用的嗎?

+0

+1 ,一個完整的答案。 – 2010-06-27 09:23:16

4

到了外面的世界,在許多方面的事件看起來像類的字段。就像你不能使用一個開放泛型類型來聲明一個字段一樣,你不能使用一個開放泛型類型來聲明一個事件。

如果您可以將類型保持爲打開狀態,那麼編譯器必須在事件處理程序中進行編譯,以便爲通用參數T添加和刪除所有可能類型的代碼。一個封閉的泛型類型不能被JIT編譯,因爲你的事件本身不是一個類型,而是一個封閉類型的一部分。

0

我不認爲這是可能的。

事件就像委託的實例(粗略地說),而實例是具體實現(泛型類或非泛型類)。

爲了更好地理解代表和事件,可以參考this SO討論。

3

這是不可能的,除非你在封閉類中定義你的類型參數。例如:

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

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

但是,這只是移動您的問題到其他位置,因爲現在你將不得不宣佈FileUploader類的兩個實例:

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

這可能不是你想要的。

1

爲什麼你需要一個通用的事件?你就不能使用普通的事件:

public delegate void FileUploadSuccess(object value); 

然後

public event FileUploadSuccess Success; 

在成功的事件處理程序,你會知道這個對象的類型被傳遞:

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

先生,我想讓它變得安全並思考仿製藥是否可以提供幫助。 – Rohit 2010-06-27 09:15:13