积极答复者
C# 事件的发布和侦听

问题
-
作为事件的发布者类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能独立开来。
答案
-
你好,你的意思我能明白
大体能通过下面两种方式实现:
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- 已标记为答案 YiChun Chen 2009年9月23日 3:45
全部回复
-
通过定义一个事件类
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里面没有预定义的一些事件可以用么? -
你好,你的意思我能明白
大体能通过下面两种方式实现:
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- 已标记为答案 YiChun Chen 2009年9月23日 3:45