我有以下事件,我班级的消费者可以联系以获取内部诊断消息。
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
答案 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));
}
}