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

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

public event EventHandler 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的type-parameter应该从EventArgsinheritance:

事件处理程序方法有两个参数。 第一个是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 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委托未指定type参数应从EventArgsinheritance。 它是FxCop,表示您违反了用于声明事件的“设计规则”。

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

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

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

更改您的事件声明和发布方法:

 public event EventHandler 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)); } }