CA1009:正确声明事件处理程序
本文关键字:事件处理 程序 声明 CA1009 | 更新日期: 2023-09-27 18:33:14
我有以下事件,我的类的使用者可以连接该事件以获取内部诊断消息。
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:
事件处理程序方法采用两个参数。第一个是类型 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>
委托未指定类型参数应继承自 EventArgs
。FxCop发出信号,表明您违反了声明事件的"设计规则"。
.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));
}
}