2010-06-27 47 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