CA1009:正确声明事件处理程序?

时间:2014-12-04 23:04:37

标签: c# .net events

我有以下事件,我班级的消费者可以联系以获取内部诊断消息。

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

2 个答案:

答案 0 :(得分:13)

根据'规则',EventHandler的type-parameter应该从EventArgs继承:

  

事件处理程序方法有两个参数。第一种是类型   System.Object并命名为'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>委托未指定type参数应从EventArgs继承。 它是FxCop,表示你违反了用于声明事件的“设计规则”。

答案 1 :(得分:3)

.NET中的事件通常应该包含一些EventArgs的衍生产品,而你的产品却没有,所以我猜这就是问题所在。

定义事件发布的事件参数:

public class StringEventArgs : EventArgs
{
    public StringEventArgs(string message) { this.Message = message; }
    public string Message { get; private set; }
}

更改您的活动声明和发布方法:

public event EventHandler<StringEventArgs> 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, new StringEventArgs(message));
    }
}