我有一个包含许多类的类库,并且在每个类中我都会引发一些事件。
每个事件都有自己的一组事件参数,因此我将这些作为自动属性存储在继承自EventArgs
. 然后,我可以通过简单地调用并传入我继承类Invoke
的新实例来引发相关事件。EventArgs
这就是我的意思:
using System;
//My Class Library
namespace MyClassLibrary
{
//A class
public class MyClass
{
//My event is a field
public event EventHandler<MyEventHandler> myEvent;
//I raise my event in this method
public void InvokeMyEvent()
{
//Do some stuff
//I raise my event here
myEvent.Invoke(this, new MyEventHandler("The quick brown fox jumps over the lazy dog"));
//Do some more stuff
}
}
//An event handler, containing some interesting data about the event
public class MyEventHandler : EventArgs
{
//Some interesting data as an automatic property
public string MyInterestingData { get; private set; }
//I assign the value of my intersting data in my constructor
public MyEventHandler(string FooBar)
{
MyInterestingData = FooBar;
}
}
}
所以这就是我想做的。现在,在我的应用程序中,我可以像这样添加对我的类库的引用、实例化MyClass
和订阅我的事件。这样做的好处(使用通用事件处理程序)是 Intellisense 允许我在订阅我的事件时使用 Tab 键,并为我设置方法,默认传入 MyEventHandler。无需铸造。
using System;
using MyClassLibrary;
namespace ConsoleApplication33
{
class Program
{
static void Main(string[] args)
{
MyClass x = new MyClass();
x.myEvent += new EventHandler<MyEventHandler>(x_myEvent);
}
static void x_myEvent(object sender, MyEventHandler e)
{
//Doing lots of important stuff
//Able to access my interesting data in my event handler without casting
var y = e.MyInterestingData;
}
}
}
这一切都编译得很好,但是类库的重点肯定是有一堆可重用的代码,这肯定是这里的意图。所以我想将我的类库添加到一些项目中。在其中一些项目中,我需要订阅myEvent
,在其他项目中不需要,但我仍然想在这些项目中使用该类的其他功能,并且将来可以选择订阅myEvent
。
但是,如果我在我不订阅的项目中使用我的类库,那么myEvent
每当myEvent
引发运行时错误时,我都会收到运行时错误。
myEvent
我通过在构造函数中订阅MyClass
一个空方法来解决这个问题,如下所示:
public MyClass()
{
myEvent += new EventHandler<MyEventHandler>(MyClass_myEvent);
}
void MyClass_myEvent(object sender, MyEventHandler e)
{
}
这意味着我可以将我的类库添加到任何项目中,实例化MyClass
和使用它提供的其他功能,并在需要时订阅,myEvent
如果不需要则忽略myEvent
。
问题是我在 MyClass 中有一个空方法。想象一下这种情况,但有大约 30 个事件,因此有 30 个空方法。
几个问题
- 我说得有道理吗?就像你至少理解我想要做什么一样,即使你认为我做这一切都错了?
- 这里实际上是否存在问题,或者这是实现我想要实现的功能的相当标准的方式?
谢谢