我有以下事件,我的类的消费者可以连接起来获取内部诊断消息。

public event EventHandler<string> OutputRaised;

我用这个函数引发事件
protected virtual void OnWriteText(string e)
    {
        var handle = this.OutputRaised;
        if (handle != null)
        {
            var message = string.Format("({0}) : {1}", this.Port, e);
            handle(this, message);
        }
    }

为什么要让CA1009正确声明事件处理程序?我发现所有的答案似乎都不适合我的情况…只是想了解一下,我对事件和代表还没有真正的把握。
CA1009参考:http://msdn.microsoft.com/en-us/library/ms182133.aspx

最佳答案

根据“规则”,eventhandler的类型参数应继承自eventargs:
事件处理程序方法有两个参数。第一种是
对象,名为“sender”。这是引发
事件。第二个参数的类型是System.EventArgs,它是
名为“E”。这是与事件关联的数据。为了
例如,如果在打开文件时引发事件,则
数据通常包含文件名。
对你来说,可能是这样的:

public class StringEventArgs : EventArgs
{
   public string Message {get;private set;}

   public StringEventArgs (string message)
   {
      this.Message = message;
   }

}

你的事件处理程序:
public event EventHandler<StringEventArgs> OutputRaised;

引发事件时,您当然应该创建StringEventArgs类的实例:
protected virtual void OnWriteText( string message )
{
    var handle = this.OutputRaised;
    if (handle != null)
    {
        var message = string.Format("({0}) : {1}", this.Port, e);
        handle(this, new StringEventArgs(message));
    }
}

我还要补充一点,理论上,你的代码没有问题。编译器不会抱怨,你的代码也能工作。EventHandler<T>委托未指定类型参数应继承自EventArgs
是fxcop发出信号,表明您违反了声明事件的“设计规则”。

08-05 00:33
查看更多