我有以下事件,我的类的消费者可以连接起来获取内部诊断消息。
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发出信号,表明您违反了声明事件的“设计规则”。