如何在c#中为泛型委托声明泛型事件

Roh*_*nsi 13 .net c#

我有一个用户控件来处理fileupload.我已经定义了一个委托如下

public delegate void FileUploadSuccess<T>(T value,FileUploadType F)
Run Code Online (Sandbox Code Playgroud)

value可以是字符串也可以是字节数组.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
Run Code Online (Sandbox Code Playgroud)

我想要的是一般事件

public event FileUploadSuccess<T> successString. 
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 16

除了作为通用类型的一部分(即

class Foo<T> { public event SomeEventType<T> SomeEventName; }
Run Code Online (Sandbox Code Playgroud)

)没有泛型属性,字段,事件,索引器或运算符(只有泛型类型和泛型方法).这里的包含类型可以是通用的吗?


Dav*_*d M 5

在外界看来,一个事件在很多方面看起来都像是课堂的一个领域。正如您不能使用开放泛型类型来声明字段一样,您也不能使用开放泛型类型来声明事件。

如果您可以让类型保持打开状态,那么编译器将不得不在事件处理程序中编译,为您的泛型参数的每个可能类型添加和删除代码T。封闭的泛型类型无法进行 JIT 编译,因为您的事件本身并不是一种类型,而是封闭类型的一部分。


Ron*_*erg 5

除非您在封闭类中定义类型参数,否则这是不可能的。例如:

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

public class FileUploader<T>
{
    public event FileUploadSuccess<T> FileUploaded;
}
Run Code Online (Sandbox Code Playgroud)

但这只会将您的问题转移到另一个位置,因为现在您必须声明FileUploader该类的两个实例:

FileUploader<string> stringUploader = new FileUploader<string>();
FileUploader<byte[]> stringUploader = new FileUploader<byte[]>();
Run Code Online (Sandbox Code Playgroud)

这可能不是您想要的。