问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

iviewactiondelegate怎样获取当前的action

发布网友 发布时间:2022-04-22 10:35

我来回答

1个回答

热心网友 时间:2022-04-22 12:04

一、委托Delegate
一般的方法(Method)中,我们的参数总是string,int,DateTime...这些基本的数据类型(或者没有参数),比如

public void HelloWorld()
{
Console.WriteLine("Hello World!");
}
public void HelloWorld(string name)
{
Console.WriteLine("Hello ,{0}!", name);
}

但是有些时候,我们希望把一个方法本身当做参数传递给另一个方法,比如
myObject.callMethod(HelloWorld);
在没有委托之前,这是一件极困难的事情,委托出现以后,这就是一件很容易的事情了,简单点讲:委托就是一种能把方法当做参数来使用的类型--当然这个定义跟官方的解释比起来极不严密,但易于理解
要点:
1.委托是一种类型(跟string,int,double...一样是.net的一种基本类型)
2.委托的定义必须与最终被调用的方法保持签名一致
比如:下面代码中的
delegate void D1(); 与 static void HelloWorld1(),我们抛开前面的类型关键字delegate与static,他们的签名都是void X()
void D2(string myName);与void HelloWorld2(string name); void HelloWorld3(string name);它们的签名格式都是 void X(string Y)
3.委托的好处之一在于可以保持签名格式不变的情况下,动态调用不同的处理逻辑(即不同的方法)
想想系统控件中的Button类,系统并不知道按钮按下去时到底会执行怎么样的逻辑(点击后的处理,每个项目可能都不一样,完全由需求决定),但是我们知道每个Button都有一个Click(object sender, EventArgs e)这样的东东,没错,就是委托(当然封装成了另一种衍生类型event),就是这种设计保证了统一的格式,不管你实际开发中想如何处理点击后的逻辑,只要按这个统一的签名来就行了
完整代码演示:

using System;
namespace ActionStudy
{
class Program
{

delegate void D1();
delegate void D2(string myName);

static void Main(string[] args)
{
D1 d1 = new D1(HelloWorld1);
d1();

D2 d2 = new D2(HelloWorld2);
d2("Jimmy");

d2 = new D2(HelloWorld3);
d2("杨俊明");

Console.Read();

}

static void HelloWorld1()
{
Console.WriteLine("Hello World!");
}

static void HelloWorld2(string name)
{
Console.WriteLine("Hello,{0}!", name);
}

static void HelloWorld3(string name)
{
Console.WriteLine("你好,{0}!", name);
}
}
}

二 、匿名方法(.net2.0开始支持)
在“一、委托Delegate”的演示代码中,我们看到委托调用方法前,至少得先定义一个签名相同的方法,然后才能由委托调用(哪怕是只有一行代码的方法),好象有点烦哦,想偷懒,ok,没问题

using System;
namespace ActionStudy
{
class Program
{

delegate void D1();
delegate void D2(string myName);

static void Main(string[] args)
{
D1 d1 = delegate
{
Console.WriteLine("Hello World!");
};
d1();

D2 d2 = delegate(string name)
{
Console.WriteLine("Hello,{0}!", name);
};

d2("Jimmy");

d2 = delegate(string name)
{
Console.WriteLine("你好,{0}!", name);
};

d2("杨俊明");

Console.Read();

}
}
}

运行效果完全相同,只是省去了方法的单独定义部分
到了.net 3.0这种偷懒的作风更夸张,看下面的代码(利用了Lambda表达式)

using System;
namespace ActionStudy
{
class Program
{

delegate void D1();
delegate void D2(string myName);

static void Main(string[] args)
{

D1 d1 = () => { Console.WriteLine("Hello World!"); };
d1();

D2 d2 = (string name) => { Console.WriteLine("Hello,{0}!", name); };
d2("Jimmy");

d2 = (string name) => { Console.WriteLine("你好,{0}!", name); };
d2("杨俊明");

Console.Read();

}
}
}

运行效果仍然没变,初次接触者可能感觉很怪,其实我也觉得怪,不过很多大牛们都喜欢这样用,所以至少还是要能看得懂,否则别人会说"你 Out了" :)
三、Action
Action的本质就是委托,看它的定义:

namespace System
{
// 摘要:
// Encapsulates a method that takes no parameters and does not return a value.
public delegate void Action();
}

namespace System
{
// 摘要:
// Encapsulates a method that takes a single parameter and does not return a
// value.
//
// 参数:
// obj:
// The parameter of the method that this delegate encapsulates.
//
// 类型参数:
// T:
// The type of the parameter of the method that this delegate encapsulates.
public delegate void Action<T>(T obj);
}

当然,还有Action<T1,T2>乃至Action<T1,T2,T3,T4>参数个数从2到4的类型,不过定义都差不多
简单点讲,Action是参数从0到4,返回类型为void(即没有返回值)的委托

using System;
namespace ActionStudy
{
class Program
{

static Action A1;
static Action<string> A2;

static void Main(string[] args)
{
A1 = new Action(HelloWorld1);
A1();

A2 = new Action<string>(HelloWorld2);
A2("Jimmy");

A2 = (string name) => { Console.WriteLine("你好,{0}!", name); };
A2("杨俊明");

A2 = delegate(string name) { Console.WriteLine("我就是委托,{0} 你说对吗?", name); };
A2("菩提树下的杨过");

Console.Read();

}

static void HelloWorld1()
{
Console.WriteLine("Hello World!");
}

static void HelloWorld2(string name)
{
Console.WriteLine("Hello,{0}!", name);
}

}

}

四、Func
Func其实也是一个"托"儿,呵呵,不过这个委托是有返回值的。看下定义就知道了:

namespace System
{
// 摘要:
// Encapsulates a method that has no parameters and returns a value of the type
// specified by the TResult parameter.
//
// 类型参数:
// TResult:
// The type of the return value of the method that this delegate encapsulates.
//
// 返回结果:
// The return value of the method that this delegate encapsulates.
public delegate TResult Func<TResult>();
}

namespace System
{
// 摘要:
// Encapsulates a method that has one parameter and returns a value of the type
// specified by the TResult parameter.
//
// 参数:
// arg:
// The parameter of the method that this delegate encapsulates.
//
// 类型参数:
// T:
// The type of the parameter of the method that this delegate encapsulates.
//
// TResult:
// The type of the return value of the method that this delegate encapsulates.
//
// 返回结果:
// The return value of the method that this delegate encapsulates.
public delegate TResult Func<T, TResult>(T arg);
}

同Action类似,Func的参数从1到5个,有5个不同的重载版本
代码:

using System;
namespace ActionStudy
{
class Program
{

static Func<string> F;
static Func<DateTime, string> F2;

static void Main(string[] args)
{
F = new Func<string>(HelloWorld1);
Console.WriteLine(F());

F2 = new Func<DateTime, string>(HelloWorld2);
Console.WriteLine(F2(DateTime.Now));

Console.Read();

}

static string HelloWorld1()
{
return "Hello World!";
}

static string HelloWorld2(DateTime time)
{
return string.Format("Hello World,the time is {0}.", time);
}

}
}

五、匿名委托
ok,如果你没有晕的话,再来看一下匿名委托,其实这也是一种偷懒的小伎俩而已
看代码说话:
//F = new Func<string>(HelloWorld1);
其实也可以简写成这样:
F = HelloWorld1;
//F2 = new Func<DateTime, string>(HelloWorld2);
其实也可以简写成这样
F2 = HelloWorld2;

方法直接赋值给委托,这二个类型不同吧???
没错,你会发现编译一样能通过,系统在编译时在背后自动帮我们加上了类似 “= new Func<...>”的东东,所以我们能偷懒一下下,这个就是匿名委托。
如果你细心的话,会发现我们在定义Button的Click处理事件时,通常是这样的:
this.button1.Click += new EventHandler(button1_Click);
但有时候我们也可以写成这样:
this.button1.Click += button1_Click;
这其实就是匿名委托的应用.
六、事件event
其实,这...还是个托儿!
我们来看下按钮Click事件的定义
// 摘要:
// Occurs when the control is clicked.
public event EventHandler Click;
继续刨根问底,查看EventHandler的定义:

using System.Runtime.InteropServices;

namespace System
{
// 摘要:
// Represents the method that will handle an event that has no event data.
//
// 参数:
// sender:
// The source of the event.
//
// e:
// An System.EventArgs that contains no event data.
[Serializable]
[ComVisible(true)]
public delegate void EventHandler(object sender, EventArgs e);
}

看到了吧,就是委托!
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
Linux系统安装FTP服务器 Linux系统的网络文件共享 建筑的七盏明灯的内容简介 面向对象设计七大原则 简单说 交互设计七大定律 交互设计的“根”——七大定律 交互设计原则和理论2——七大定律 七大设计原则 附近的加油站有哪些 附近的加油站有哪些地方 CATIA最低的配置是什么 用笔记本按装CATIA需要什么配置 英国维珍航空 航空里程问题 维珍航空香港悉尼一年往返 维珍航空留学生票如何付费? 在欧美嘉买的票为什么维珍航空上查不到 关于维珍航空公司 《荒野大镖客2》救赎怎么在亚瑟死之前把钱存起来留给约翰? 卢森堡的约翰的介绍 外地带什么北京特产回去比较好 来北京出差,走前想给同事朋友带点小礼物回去,什么比较好 马上出差去北京,北京有什么特产? 我从北京出差回去,带点什么东西好呢 流量控制延误什么意思 什么叫航班流量控制延误? 即将去北京出差了,北京有什么特产带吗 去北京出差,该带些什么东西回来 从北京出差能带什么特色回去? 流量限制飞机延误一般多长 被别人改了手机号,怎样才能修改回来? 水瓶座的男生遇见爱情会有哪些反应? 酷狗繁星怎么签约 水瓶座男生专一吗 以某企业或者某产品为例,谈谈规避网络营销风险的对策 一千一左右 多谢 关于网络安全的 电子商务从开始到现在的发展趋势 用五种感官写一种景物用五感法描写窗外景物片段 描写窗外景色的优美句子,还有描写“帅哥”、“美女”的好句子有哪些? 描写窗外景色的好词 打篮球时投篮运球分别用到的是哪些肌肉? 用诗歌描写窗外的景色? 打篮球后,背部肌肉疼是怎么回事 用几句话写一写窗外的雨景,注意表现景物的动态美。怎么写? 描写车窗外的景色的段落 太平洋保险儿童健康险 picpick怎么截图啊、、、 PicPick 和 FastStone Capture哪个好 怎样用picpick软件截取滚动窗口 乙醇硫是有机物吗 通达信如何统计一段时间的最高价?有什么简便方法?