事件、委托、委托方法的总结(使用EventHandler<>)
在C#中,定义事件、委托、委托方法可以使用类库内的EventHandler泛型委托来定义事件、并根据该泛型委托定义实现方法;
同样您也可以自定义委托 来定义事件以及 根据自定义的委托来定义实现事件的方法方法 :
在开始之前,我还是要介绍一下什么是事件,以及“事件”与“事件的实现”的区别:
什么是事件?
在C#中,事件就是一个宽泛的、无具体实现的事情,事件是宽泛的、只代表概念而不代表实现,具体的事件触发是通过委托调用实现方法来。
什么是EventArgs类?有什么用?
EventArgs类主要作用在于:在事件触发时,向实现的方法内传递参数,并在事件实现的方法内进行调用或者付值;当执行完事件触发后,定义事件的类就可以通过EventArgs取出被修改得值了;如果没什么好传递并付值的东西,就定义一个基类或者一个null。
1,使用EventHandler泛型委托来实现事件:
a,无返回值的事件调用:
第一步,定义一个委托,下面使用的是系统定义的泛型委托类:EventHandler<>
[Serializable]
public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e);其中TEventArgs为泛化类型;
-----------------------------------------------------------------------------------------------------------------
第二步,定义TEventArgs 为 ValidationEventArgs,下面是该类的代码:
namespace Microsoft.VisualStudio.TestTools.WebTesting
{
// 摘要:
// 为 Microsoft.VisualStudio.TestTools.WebTesting.WebTestRequest.ValidateResponse
// 事件提供数据。
public class ValidationEventArgs : EventArgs
{
// 摘要:
// 获取或设置一个值,该值指示请求是否通过验证。
//
// 返回结果:
// 如果请求通过验证,则为 true;否则为 false。
public bool IsValid { get; set; }
//
// 摘要:
// 获取或设置描述验证尝试的消息。
//
// 返回结果:
// 获取指示是否发生验证的值,或者获取描述所引发异常的消息。
public string Message { get; set; }
//
// 摘要:
// 获取 Microsoft.VisualStudio.TestTools.WebTesting.WebTestRequest,它生成已验证的响应。
//
// 返回结果:
// 一个 Microsoft.VisualStudio.TestTools.WebTesting.WebTestRequest 对象。
public WebTestRequest Request { get; }
//
// 摘要:
// 获取所验证的 Microsoft.VisualStudio.TestTools.WebTesting.WebTestResponse。
//
// 返回结果:
// 一个 Microsoft.VisualStudio.TestTools.WebTesting.WebTestResponse 对象。
public WebTestResponse Response { get; }
//
// 摘要:
// 获取当前验证级别。
//
// 返回结果:
// 一个 Microsoft.VisualStudio.TestTools.WebTesting.ValidationLevel 枚举值。
public ValidationLevel ValidationLevel { get; }
//
// 摘要:
// 获取 Web 测试,该测试包含触发了验证事件的请求。
//
// 返回结果:
// 一个 Microsoft.VisualStudio.TestTools.WebTesting.WebTest 对象。
public WebTest WebTest { get; }
}
}
-----------------------------------------------------------------------------------------------------------------
第三步,定义事件的实现方法:在事件所在类内,或者其他类中:例如:
public override void Validate(object sender, ValidationEventArgs e)
{
e.IsValid = false;
if (!IsNullorEmpty())
{
int Eresult = (int)_sqlUtil3.ExecuteSql(_sqlInfo);
if (_sqlInfo.TestType.ToLower().Contains("negitive"))
{
if (Eresult == 0)
{
e.IsValid = false;
}
}
else if (_sqlInfo.TestType.ToLower().Contains("positive"))
{
if (Eresult == 0)
{
e.IsValid= true;
}
}
}
}
-----------------------------------------------------------------------------------------------------------------
第四步,定义一个触发事件的类并定义事件为委托类型,即事件的类型(委托类型):
public class TouchClass
{
public event EventHanlder<ValidationEventArgs>(事件的类型为EventHanlder<ValidationEventArgs>委托类型) DataEvent;
public WebTest_Sql _webTeset_sql = new WebTest_Sql(); //实例化事件所在的类,一便调用事件使用;
DataEvent += EventHanlder<ValidationEventArgs>(_webTeset_sql.Validate);//将事件与方法绑定,注意此处并未执行调用方法,只是将事件与方法做了绑定;
DataEvent(this,ValidationEventArgs); 或者DataEvent.invoke(this,ValidationEventArgs)//事件的执行,注意:这才是事件的执行语句。
}
-----------------------------------------------------------------------------------------------------------------
b,有返回值的事件调用:
第一步,定义一个委托,下面使用的是系统定义的泛型委托类:EventHandler<>
[Serializable]
public delegate string EventHandler<TEventArgs>(object sender, TEventArgs e);其中TEventArgs为泛化类型;
-----------------------------------------------------------------------------------------------------------------
第二步,定义TEventArgs 为 ValidationEventArgs,下面是该类的代码:
namespace Microsoft.VisualStudio.TestTools.WebTesting
{
// 摘要:
// 为 Microsoft.VisualStudio.TestTools.WebTesting.WebTestRequest.ValidateResponse
// 事件提供数据。
public class ValidationEventArgs : EventArgs
{
// 摘要:
// 获取或设置一个值,该值指示请求是否通过验证。
//
// 返回结果:
// 如果请求通过验证,则为 true;否则为 false。
public bool IsValid { get; set; }
//
// 摘要:
// 获取或设置描述验证尝试的消息。
//
// 返回结果:
// 获取指示是否发生验证的值,或者获取描述所引发异常的消息。
public string Message { get; set; }
//
// 摘要:
// 获取 Microsoft.VisualStudio.TestTools.WebTesting.WebTestRequest,它生成已验证的响应。
//
// 返回结果:
// 一个 Microsoft.VisualStudio.TestTools.WebTesting.WebTestRequest 对象。
public WebTestRequest Request { get; }
//
// 摘要:
// 获取所验证的 Microsoft.VisualStudio.TestTools.WebTesting.WebTestResponse。
//
// 返回结果:
// 一个 Microsoft.VisualStudio.TestTools.WebTesting.WebTestResponse 对象。
public WebTestResponse Response { get; }
//
// 摘要:
// 获取当前验证级别。
//
// 返回结果:
// 一个 Microsoft.VisualStudio.TestTools.WebTesting.ValidationLevel 枚举值。
public ValidationLevel ValidationLevel { get; }
//
// 摘要:
// 获取 Web 测试,该测试包含触发了验证事件的请求。
//
// 返回结果:
// 一个 Microsoft.VisualStudio.TestTools.WebTesting.WebTest 对象。
public WebTest WebTest { get; }
}
}
-----------------------------------------------------------------------------------------------------------------
第三步,定义事件的实现方法:在事件所在类内,或者其他类中:例如:
public override string Validate(object sender, ValidationEventArgs e)
{
e.IsValid = false;
if (!IsNullorEmpty())
{
int Eresult = (int)_sqlUtil3.ExecuteSql(_sqlInfo);
if (_sqlInfo.TestType.ToLower().Contains("negitive"))
{
if (Eresult == 0)
{
e.IsValid = false;
}
}
else if (_sqlInfo.TestType.ToLower().Contains("positive"))
{
if (Eresult == 0)
{
e.IsValid= true;
}
}
}
}
-----------------------------------------------------------------------------------------------------------------
第四步,定义一个触发事件的类并定义事件为委托类型,即事件的类型(委托类型):
public class TouchClass
{
public event EventHanlder<ValidationEventArgs>(事件的类型为EventHanlder<ValidationEventArgs>委托类型) DataEvent;
public WebTest_Sql _webTeset_sql = new WebTest_Sql(); //实例化事件所在的类,一便调用事件使用;
DataEvent += EventHanlder<ValidationEventArgs>(_webTeset_sql.Validate);//将事件与方法绑定,注意此处并未执行调用方法,只是将事件与方法做了绑定;
string ss = DataEvent(this,ValidationEventArgs); 或者string ss = DataEvent.invoke(this,ValidationEventArgs)//事件的执行,注意:这才是事件的执行语句。
}
事件、委托、委托方法的总结(使用EventHandler<>)的更多相关文章
- 委托-异步调用-泛型委托-匿名方法-Lambda表达式-事件【转】
1. 委托 From: http://www.cnblogs.com/daxnet/archive/2008/11/08/1687014.html 类是对象的抽象,而委托则可以看成是函数的抽象.一个委 ...
- 委托、Lambda表达式、事件系列04,委托链是怎样形成的, 多播委托, 调用委托链方法,委托链异常处理
委托是多播委托,我们可以通过"+="把多个方法赋给委托变量,这样就形成了一个委托链.本篇的话题包括:委托链是怎样形成的,如何调用委托链方法,以及委托链异常处理. □ 调用返回类型为 ...
- C#基础精华07(委托事件,委托的使用,匿名方法)
1.委托概述 委托是一种数据类型,像类一样(可以声明委托类型变量).方法参数可以是int.string.类类型 void M1(int n){ } √ void M2(string s){ } √ ...
- 委托、事件、匿名方法、Lambda
一.委托(delegate) 定义:public delegate void/类型 DefinedDelegate(参数1,参数2...) 委托是类型安全的. 委托实例:DefinedDe ...
- 原生js事件委托(事件代理)方法扩展
原生js事件委托(事件代理)方法扩展: 通过Node底层原型扩展委托方法 /** * 事件委托方法 * @param eventName {string}:事件名称,如'click' * @param ...
- c#事件与委托
C#.net 目录(?)[-] 将方法作为方法的参数 将方法绑定到委托 事件的由来 事件和委托的编译代码 委托事件与Observer设计模式 范例说明 Observer设计模式简介 实现范例的Obse ...
- 《C#高级编程》学习笔记------C#中的事件和委托
本文转载自张子阳 目录 委托的作用 将方法绑定到委托 事件的来由 Observer设计模式 .Net Framework中的委托与事件 引言 委托 和 事件在 .Net Framework中的应用 ...
- 每天进步一点--c#基础巩固,事件、委托
要想技术有所提高,就是把有些问题真正的弄懂弄明白,我从事C#开发两年了,一直对事件委托等概念一知半解,有时候博客园上看看别的大牛的文章,看看懂了就过去了,时间长了又忘了,真正理解还是要自己动手弄些例子 ...
- Unity C# 多态 委托 事件 匿名委托 Lambda表达式 观察者模式 .NET 框架中的委托和事件
一.多态 里氏替换原则: 任何能用基类的地方,可以用子类代替,反过来不行.子类能够在基类的基础上增加新的行为.面向对象设计的基本原则之一. 开放封闭原则: 对扩展开放,意味着有新的需求或变化时,可以对 ...
随机推荐
- Tomcat容器运行struts2+spring+mybatis架构的java web应用程序简单分析
1.具体的环境为 MyEclipse 8.5以及自带的tomcat spring3.0.5 struts2.3.15.1 mybatis3.0.5 2.想弄明白的一些问题 tomcat集成spring ...
- PHP输出缓冲控制
说到输出缓冲,首先要说的是一个叫做缓冲器(buffer)的东西.举个简单的例子说明他的作用:我们在编辑一篇文档时,在我们没有保存之前,系统是不会 向磁盘写入的,而是写到buffer中,当buffer写 ...
- 渐进记法(O,Ω,Θ)
第一次在<算法导论>中看到这三种渐进记法的符号,当时对此一窍不通,所以也就没有注意它们,直接把他们忽略了,知道学习算法的时候,才知道当初的做法有多傻,因为一个算法的好坏以及复杂度,可以用它 ...
- win下隐藏任务栏
C# 隐藏任务栏开始按钮 关闭shell 分类: .NET C# 2011-07-14 15:26 789人阅读 评论(1) 收藏 举报 shell任务c#stringnulluser 一.隐藏任务栏 ...
- MySQL 基本函数
(1).字符串类 CHARSET(str) //返回字串字符集 CONCAT (string2 [,... ]) //连接字串 INSTR (string ,substring ) //返回subst ...
- HDU 5009
http://acm.hdu.edu.cn/showproblem.php?pid=5009 题意:一个数列,每个点代表一种颜色,每次选一个区间覆盖,覆盖的代价是区间内颜色种类数的平方,直到覆盖整个数 ...
- JS的强大
JS很强大,对于网页设计者来说,会用JS真的很重要. 学好我的linux,和数据结构.
- EL 表达式 取值将 < 转成 &1t 问题
因为用JeeCMS,JeeCMS后台会存入<p></p> 内容到数据库中 用play框架取后台值的时候 用的EL表达式在前台展示 出现将< 转成 &1t HTML ...
- c++ 字符窜切割
std::vector<std::string> Tools::SplitStr(const char* baseStr, const char* rule) { log("ba ...
- 13年7月memory point
IOS/android美术资源压缩相关工具使用,shell编写; 美术资源地图压缩方案: IAP支付objc代码添加, iap cracker/iap free防破解方法, sever端增加php验证 ...