我是C#的新手和编程,我正试图弄清楚如何使用事件。以前我一直使用ActionScript3进行编程,如果你想创建自己的事件,事件是你继承的特殊类,然后任何其他类都可以调用该事件。
使用C#,我试图做类似的事情,如下:
public class EventManager
{
public delegate void TempDelegate();
public static event TempDelegate eSomeEvent;
}
public class SomeOtherClass
{
//doing some stuff, then:
if (EventManager.eSomeEvent != null)
{
EventManager.eSomeEvent();
}
}
这给了我一个编译器错误CS0070:事件'EventManager.eSomeEvent'只能出现在+ =或 - =的左侧(除非在'EventManager'类型中使用)
msdn上有关此错误的信息表示我应该使用+=
而不是尝试调用该事件,但我真的不明白这一点。我不是要尝试从SomeOtherClass
订阅任何事件到事件委托,我只是试图调用此事件,以便它开始执行那些已经订阅该事件的函数。
这样可以这样做吗?如果没有,是否可以从另一个类调用一个类的事件?我只想在我的类中重用某些事件,而不是在多个类中创建许多类似的事件。
对此有任何建议将不胜感激!
答案 0 :(得分:3)
您可以将事件调用包装在公共方法中,并使用其他类中的事件。
public void OnSomeEvent()
{
var handler = eSomeEvent;
if (handler != null) handler(this, null);
}
但是,如果您确定该事件应该与触发它的类别不同,那么您可能希望再次查看该设计。
答案 1 :(得分:1)
嗯,典型的解决方案是将eSomeEvent
调用放入EventManager
类
public class EventManager
{
public delegate void TempDelegate();
public static event TempDelegate eSomeEvent;
// Not thread safe as well as your code
// May be internal, not public is better (if SomeOtherClass is in the same namespace)
public static void PerformSomeEvent() {
if (!Object.ReferenceEquals(null, eSomeEvent))
eSomeEvent(); // <- You can do it here
}
}
public class SomeOtherClass
{
//doing some stuff, then:
EventManager.PerformSomeEvent();
}