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

时间:2010-06-27 08:54:51

标签: c# .net

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

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. 

6 个答案:

答案 0 :(得分:16)

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

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

)不存在通用属性,字段,事件,索引器或运算符(仅泛型类型和泛型方法)。这里的包含类型可以是通用的吗?

答案 1 :(得分:4)

对于外界来说,一个事件在许多方面看起来像是一个阶级的领域。正如您不能使用开放泛型类型来声明字段一样,您也不能使用开放泛型类型来声明事件。

如果你可以打开类型,那么编译器必须在事件处理程序中编译为你的泛型参数T添加和删除每种可能类型的代码。封闭的泛型类型不能被JIT编译,因为您的事件本身不是一个类型,而是封闭类型的一部分。

答案 2 :(得分:4)

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

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[]>();

这可能不是你想要的。

答案 3 :(得分:1)

为什么需要通用事件?你不能只使用正常的事件:

public delegate void FileUploadSuccess(object value);

然后

public event FileUploadSuccess Success;

在Success事件处理程序中,您将知道要传递的对象的类型:

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

答案 4 :(得分:0)

我认为这不可能。

事件就像是委托的实例(粗略地说),实例是具体的实现(泛型或非泛型类)。

为了更好地理解代表和事件,您可以参考this SO讨论。

答案 5 :(得分:0)

.Net Framework中有一个通用的EventHandler类,用于此目的:

@Rule
  public WireMockRule wireMockRule = new WireMockRule(wireMockConfig().port(8080).httpsPort(443));

stubFor(get(urlMatching("/validation/session/([a-zA-Z0-9/-]*)"))        .willReturn(aResponse().withStatus(HttpStatus.OK.value()).withHeader("Content-Type", "application/json")
              .withBody("{\"isIpBlocked\": \"Y\"}")));

来源:https://mywebsite/validation/session/687d69ae-42a8-4584-a395-8e0c876bacae