怎么控制一个委托事件里同样的方法只注册一次
大家好,请教大家一个问题。我有一个单例窗体如 Fax:Form 里面定义了一个委托事件
- C# code
public delegate void UpdateFaxEventHander(string tifPath);public event UpdateFaxEventHander UpdateFax;
此事件在另一个窗体的构造函数里被注册如:
- C# code
public FrmFaxTaskEdit() { InitializeComponent(); Fax.Instance.UpdateFax += new Fax.UpdateFaxEventHander(Instance_UpdateFax); }
在我每次实例化FrmFaxTaskEdit 时都会给Fax.Instance.UpdateFax 注册Instance_UpdateFax 这个方法。
想请教下大家 有什么判断条件可以控制 Instance_UpdateFax 只被UpdateFax这个事件注册一次。
注:不想在窗体的Closed事件中注销这个事件的方法,因为FrmFaxTaskEdit可能会被打开多个。这样也起不到作用。
请教啦!
[解决办法]
if(Fax.Instance.UpdateFax == null)
{
Fax.Instance.UpdateFax += new Fax.UpdateFaxEventHander(Instance_UpdateFax);
}
[解决办法]
用事件访问器。
在add和remove里面写自己的逻辑就行了。
[解决办法]
事件注册不放在构造函数中,定义一个方法来注册,这样你可以在代码中控制什么情况下注册
[解决办法]
OK,搞定了,代码如下:
Fax.Instance.UpdateFax += new Fax.UpdateFaxEventHander(Instance_UpdateFax);
if (!Fax.Instance.UpdateFax.GetInvocationList().Contains((UpdateFaxEventHander)Instance_UpdateFax))
{
UpdateFax += new UpdateFaxEventHander(Instance_UpdateFax);
}
-------------
解释一下,这个GetInvocationList()可以获取委托链,就是说你绑定了哪些函数要执行。 在这个委托链中判断下是否已经添加就可以了。
[解决办法]
[解决办法]
这样就可以了:
- C# code
Delegate[] allDlg = new Delegate[this.UpdateFax.GetInvocationList().GetLength(0)]; this.UpdateFax.GetInvocationList().CopyTo(allDlg, 0); foreach (Delegate dlg in allDlg) { if (dlg.Method.Name == "Form1_UpdateFax") { //不在绑定 } else { //绑定 UpdateFax += new UpdateFaxEventHander(Form1_UpdateFax); MessageBox.Show("绑定成功"); } }
[解决办法]
[解决办法]
用单例模式 如下:
- C# code
class Program { static void Main(string[] args) { pokeer pk = pokeer.GetIntence(); } } class pokeer { private readonly static object pkLog = new object(); private static pokeer pk = null; private pokeer() { } public static pokeer GetIntence() { if (pk == null) { lock (pkLog) { if (pk == null) { pk = new pokeer(); } } } return pk; } }
[解决办法]
[解决办法]
[解决办法]
System.Delegate 成员
所有委托隐式继承自System.Delegate 你看看这个类中提供那些属性及方法。。
其中:
有意思的方法:
DynamicInvoke动态调用(后期绑定)由当前委托所表示的方法。
GetInvocationList 返回委托的调用列表。
Remove 从一个委托的调用列表中移除另一个委托的最后一个调用列表。
RemoveAll 从一个委托的调用列表中移除另一个委托的所有调用列表。
属性:
Method 获取委托所表示的方法。
Target 获取类实例,当前委托将对其调用实例方法。
[解决办法]
何必呢,写个单件模式的类,专门负责绑定不就好了