我正在尝试在 C# 中开发事件模型。我是 C# 的新手,有 C++ 经验。我的问题是:我可以在没有类实例的情况下创建一个方法的委托吗?看看这段代码:
public delegate void _CurrentDelegate<EventData>( EventData ev );
public class EventInterface{
public void Call<EventData>( _CurrentDelegate<EventData> methodToInvoke, EventData data ){
methodToInvoke( data );
}
}
public class EventClass {
protected List<EventInterface> _Listeners;
private bool _InBlock;
public EventClass(){
_Listeners = new List<EventInterface>();
_InBlock = false;
}
public void AddListener( EventInterface listener ){
if ( _Listeners.Find( predicate => predicate.Equals(listener) ) != null )
return;
_Listeners.Add( listener );
}
public void RemoveListener( EventInterface listener ){
if ( _Listeners.Find( predicate => predicate.Equals(listener) ) != null )
_Listeners.Remove( listener );
}
public void BlockEvents( bool Block ){
_InBlock = Block;
}
public void Signal<EventData>( _CurrentDelegate<EventData> methodToInvoke, EventData data ){
if ( !_InBlock ){
foreach( EventInterface listener in _Listeners ){
listener.Call( methodToInvoke, data );
}
}
}
}
所以,我正在尝试创建一个模板事件类,我可以在其中存储我的监听器。在方法 Signal 中,我试图将委托传递给每个侦听器都必须执行的方法。
例子应该看。像这样:
public class TableManagerEvents : EventInterface {
virtual public void OnMatchDetected( List<int> matches ) {}
}
public class TableManager : AstronomatchData.EventClass {
public void CheckTable(){
List<int> matches = new List<int>();
TableManagerEvents newev = new TableManagerEvents();
AddListener( newev );
_CurrentDelegate<List<int>> del = TableManagerEvents.OnMatchDetected; // problem
Signal( del, matches );
}
}
标记为问题的那一行,我收到一个错误错误 CS0120: An object reference is required to access non-static member。
我找到的一个解决方案是制作一个TableManagerEvents.OnMatchDetected
静态的,但这不是我想要的。
我试图找到一个解决方案 3 天,但没有。