我想创建一个包含一些信息的数据类,并提供一个event
来处理这些信息。
public abstract class EventData<T> where T : EventData<T>
{
Action<T> action_;
public void Subscribe(Action<T> _actor) { action_ += _actor; }
public void Unsubscribe(Action<T> _actor) { action_ -= _actor; }
public void Dispatch(T _data) { if (action_ != null) action_(_data); }
}
public class ConcreteEventData : EventData<ConcreteEventData>
{
int arg1;
string arg2;
}
因此,即使我牢记要使用与上述相同的类型,我还是不得不使用那种不舒服的结构ConcreteEventData : EventData<ConcreteEventData>
而不是简单而简短的ConcreteEventData : EventData
。
此外,如果某人将使用该基类,他可能会编写如下内容:
public class AnotherConcreteEventData : EventData<ConcreteEventData>
{
float arg1;
bool arg2;
}
如您所见,使用这种想法不是一种好方法,还有另一种方法可以使它更优雅吗?
答案 0 :(得分:0)
好的,解决方案很简单。不用为我的“事件”创建类,我可以简单地将EventArgs
用作不需要事件的数据类。
我的目标是将其用于EventBus,而不是像
public abstract class EventData<T> where T : EventData<T>
{
Action<T> action_;
public void Subscribe(Action<T> _actor) { action_ += _actor; }
public void Unsubscribe(Action<T> _actor) { action_ -= _actor; }
public void Dispatch(T _data) { if (action_ != null) action_(_data); }
}
public class EventBus
{
static Dictionary<string, EventData> _dict;
}
(此外,我无法做到这一点,我也可能被迫为此问题找到解决方案) 我可以简单地使用
public class EventBus<T> where T : EventArgs
{
static Dictionary<string, Action<T>> list;
public static void SubscribeOnEvent(string _sid, Action<T> _method)
{
// Do Stuff...
}
}
并以
的方式使用它EventBus<MyData>.Subscibe("myID", (data) => { /*Do stuff...*/ });
现在我可以使用从EventArgs
派生的所有数据。感谢@JeroenMostert的想法。