为了账号安全,请及时绑定邮箱和手机立即绑定

是获取抽象类类型的派生类类型的任何方法

是获取抽象类类型的派生类类型的任何方法

C#
泛舟湖上清波郎朗 2022-08-20 16:03:57
我想创建一个数据类,它将包含一些信息,并提供一个来处理该信息的数据类。eventpublic 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 : EventDatapublic class AnotherConcreteEventData : EventData<ConcreteEventData>{    float arg1;    bool arg2;}如您所见,这不是使用该想法的好方法,是否有另一种方法可以更优雅地使用它?
查看完整描述

1 回答

?
慕仙森

TA贡献1827条经验 获得超7个赞

好的,解决方案很简单。而不是为我的“事件”创建一个类,我可以简单地用作数据类,不需要任何事件。我的目标是将其用于EventBus,而不是做这样的事情EventArgs


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...*/ });

现在我可以使用所有数据,来自.感谢@JeroenMostert的想法。EventArgs


查看完整回答
反对 回复 2022-08-20
  • 1 回答
  • 0 关注
  • 91 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信