none
C# 事件的发布和侦听 RRS feed

  • 问题

  • 作为事件的发布者类A来说,在它里面定义了事件XXXEvent。

            public delegate void XXXHander(int param);
            public static event XXXHander XXXEvent;

           if 满足我的条件
                if (XXXEvent != null)
                        XXXEvent(param);

    然后在事件的接受者类B那里,添加对事件的侦听

     类A.XXXEvent += this.OnXXXEvent;

    当类A的事件XXX发布时,执行自己的OnXXXEvent函数。


    我的问题是:
    在这里事件的发布者类A是无所谓B存不存在的
    而类B使用时,必须 引用类A,不然会出错,因为它里面有这一句直接调用了类A--->A.XXXEvent += this.OnXXXEvent;

    我现在希望,事件能从A,B中独立出来。
    也就是说我自己单独定义一种事件类型,
    类A,在满足一定条件时,发布这种事件
    而类B则接受这种事件。并不需要引用类A。

    不知道我说清楚了没……也就是我希望A和B能独立开来。

    2009年9月17日 9:18

答案

  • 你好,你的意思我能明白
    大体能通过下面两种方式实现:
    1,在运行时通过反射的方法基于类A的派生类,并添加事件,不过由于这种方法使用了反射性能不是很好,且比较的复杂
    2,如果你仅是想让B类不引用类A 但是却要使用这个事件,那么你可以定义一个接口,接口中包含事件XXXEvent的签名,然后类A实现这个接口,这样你就可以在B类中通过这个接口来对A的事件进行操作了 而不需要用到A这个类的签名

    比如B类有个属性是IXXXEvent这个接口 名称xxxEventInstance
    在B类的构造函数或者通过属性将其值设置为A类的实例
    bInstance.xxxEventInstance=aInstance;
    bInstance 是B类的实例aInstance是A类的实例
    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://hi.baidu.com/1987raymond
    2009年9月18日 5:08
    版主

全部回复

  • 我理解大概的
    我不知道怎么解释清楚
    用个故事来解释 首先A类的人正好有事件委托B类的人 然后B类的人帮完成逻辑交给A类 
    你要求A类的人发布这个事件 给B类的人 不需要引用A类 
    必须B类的人 需要声明新的事件委托和A类的相同 然后发布事件让b类的人接受
    • 已建议为答案 mldark 2009年9月17日 13:19
    2009年9月17日 10:12
  • 你好!
         在.NET下不存在“全局事件”这个概念!
         事件都是属于类的!
         你可以通过一些API自定义一个消息来实现这个目的!
    周雪峰
    • 已建议为答案 mldark 2009年9月17日 13:19
    2009年9月17日 10:52
    版主
  • 您好,可以再单独建立一个中介,用这个中介来管理事件的订阅和发布。从而使得A和B解耦。
    代码有点复杂,如果需要可以给我您的邮箱,发一份给您。

    • 已建议为答案 mldark 2009年9月17日 13:19
    2009年9月17日 11:08
  • 可以参考出版-订阅的模式,A是出版者,B是订阅者,通过中介C登记出版者和订阅者,这样A、B就可以完全分离了。

    2009年9月18日 2:16
  • 通过定义一个事件类
            public class EventClass
            {
                public delegate void FetchDataHander(int TestNum);
                public static event FetchDataHander fetchDataEvent;

                public static event FetchDataHander FetchDataEvent
                {
                    add { fetchDataEvent += value; }
                    remove { fetchDataEvent -= value; }
                }
                public static void BroadEvent(int TestNumber)
                {
                 if (fetchDataEvent!= null)
                      fetchDataEvent(TestNumber);
                }
            }
    定义好事件,注册事件以及发布事件的函数。
    在类A中调用BroadEvent来发布事件
    类B中使用add和remove来接受事件

    这是目前我能做到的方法。
    在.Net里面没有预定义的一些事件可以用么?

    2009年9月18日 3:13
  • 你好,你的意思我能明白
    大体能通过下面两种方式实现:
    1,在运行时通过反射的方法基于类A的派生类,并添加事件,不过由于这种方法使用了反射性能不是很好,且比较的复杂
    2,如果你仅是想让B类不引用类A 但是却要使用这个事件,那么你可以定义一个接口,接口中包含事件XXXEvent的签名,然后类A实现这个接口,这样你就可以在B类中通过这个接口来对A的事件进行操作了 而不需要用到A这个类的签名

    比如B类有个属性是IXXXEvent这个接口 名称xxxEventInstance
    在B类的构造函数或者通过属性将其值设置为A类的实例
    bInstance.xxxEventInstance=aInstance;
    bInstance 是B类的实例aInstance是A类的实例
    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://hi.baidu.com/1987raymond
    2009年9月18日 5:08
    版主