您的位置:首页 > 编程语言 > C#

C# 委托 代理

2016-03-19 23:10 381 查看

C# 委托、代理

举例如下

B的show方法绑定到A的show方法,使得A在show时B也show

C#中委托代理用法

定义delegate对象类型,如:


public delegate void myEventHandler(object sender ,EventArgs e);

其中 sender代表触发事件的本身,EventArgs 是事件参数类



定义事件参数类,这个可以做也可以不做,看需求,如果需要传递一些信息,可以扩展EventArgs 类,如


public myEventArgs : EventArgs{/这里可以定义一些需要的变量,和方法/}

在传入时应该会自动上溯造型。(会吗?肯定会啊,我自己试过了)



用event关键字定义事件对象,它同时也是一个delegate对象,在绑定时要对该类的这个对象进行绑定(这个对象是一个event,也是一个delegate,也就是它包含是否绑定了事件)


public event myEventHandler show;



要被绑定的方法,也就是B的show这里的show定义和1中的delegate对象有相同的参数和返回值类型(这里呢如果扩展了EventArgs类,对B中的写法是随意的,反正可以上溯造型,恩,我试过了)如:


public void show(object sender ,EvnetArgs e){/TODO/}



绑定,绑定的方式就是对当前的show对象+=比如:


this.show += new myEventHandler((new B()).show);

这里的问题是在哪绑定,可以在A中绑定,传入B或者像这样新建一个B也可以在B中绑定,在B中传入A或者新建一个A,这里的问题是一定要代码可以走到绑定;



写A 的触发事件show,并在show中调用delegate


public void OnShow(){

if(this.show!=null)//判断是否绑定了方法,如果绑定了那就执行呗;

this.show(this,new EventArgs());

}

[/code]


整个过程写完了,现在就是触发A的OnShow就可以了


参考了寒飞雨的博文



同时附上一片比较好懂的代码修改自上述作者

using System;

using System.Collections.Generic;

using System.Text;


namespace Delegate {

// 扩展EventArgs  如果不需要可以不用

public class myEventArgs:EventArgs{

public int k= 10;

}

class Dog {

public Dog(){

Host host = new Host();

this.Alarm += new AlarmEventHandler(host.hostEventHandler);

}

//delegate

public delegate void AlarmEventHandler(object sender , myEventArgs e);

//event

public event AlarmEventHandler Alarm;

// yinfa shijian de hanshu

public void OnAlarm(){

Console.WriteLine("dog Aalrt");

if(this.Alarm!=null){

this.Alarm(this,new myEventArgs());

  }

}

}

class Host{

public void  hostEventHandler(object sender,EventArgs e){

Console.WriteLine("Host konwn");

//        Console.WriteLine(((myEventArgs)e).k);//扩展EventArgs后

/*DOTO*/

}

}


class Delegate{

public static void Main(String []args){

Dog dog = new Dog();

dog.OnAlarm();

Console.ReadKey();

}

}

}

[/code]


markdown复制过去之后会有行号,卧槽 血崩;



来自为知笔记(Wiz)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: