在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<>)的更多相关文章

  1. 委托-异步调用-泛型委托-匿名方法-Lambda表达式-事件【转】

    1. 委托 From: http://www.cnblogs.com/daxnet/archive/2008/11/08/1687014.html 类是对象的抽象,而委托则可以看成是函数的抽象.一个委 ...

  2. 委托、Lambda表达式、事件系列04,委托链是怎样形成的, 多播委托, 调用委托链方法,委托链异常处理

    委托是多播委托,我们可以通过"+="把多个方法赋给委托变量,这样就形成了一个委托链.本篇的话题包括:委托链是怎样形成的,如何调用委托链方法,以及委托链异常处理. □ 调用返回类型为 ...

  3. C#基础精华07(委托事件,委托的使用,匿名方法)

    1.委托概述 委托是一种数据类型,像类一样(可以声明委托类型变量).方法参数可以是int.string.类类型 void M1(int n){  } √ void M2(string s){  } √ ...

  4. 委托、事件、匿名方法、Lambda

    一.委托(delegate)     定义:public delegate  void/类型  DefinedDelegate(参数1,参数2...) 委托是类型安全的. 委托实例:DefinedDe ...

  5. 原生js事件委托(事件代理)方法扩展

    原生js事件委托(事件代理)方法扩展: 通过Node底层原型扩展委托方法 /** * 事件委托方法 * @param eventName {string}:事件名称,如'click' * @param ...

  6. c#事件与委托

    C#.net 目录(?)[-] 将方法作为方法的参数 将方法绑定到委托 事件的由来 事件和委托的编译代码 委托事件与Observer设计模式 范例说明 Observer设计模式简介 实现范例的Obse ...

  7. 《C#高级编程》学习笔记------C#中的事件和委托

    本文转载自张子阳 目录 委托的作用 将方法绑定到委托 事件的来由 Observer设计模式 .Net Framework中的委托与事件   引言 委托 和 事件在 .Net Framework中的应用 ...

  8. 每天进步一点--c#基础巩固,事件、委托

    要想技术有所提高,就是把有些问题真正的弄懂弄明白,我从事C#开发两年了,一直对事件委托等概念一知半解,有时候博客园上看看别的大牛的文章,看看懂了就过去了,时间长了又忘了,真正理解还是要自己动手弄些例子 ...

  9. Unity C# 多态 委托 事件 匿名委托 Lambda表达式 观察者模式 .NET 框架中的委托和事件

    一.多态 里氏替换原则: 任何能用基类的地方,可以用子类代替,反过来不行.子类能够在基类的基础上增加新的行为.面向对象设计的基本原则之一. 开放封闭原则: 对扩展开放,意味着有新的需求或变化时,可以对 ...

随机推荐

  1. jQuery轮播图

    yii2 轮播 样式: <style type="text/css"> *{margin:0;padding:0} body{margin:50px} li{list- ...

  2. 在php中需要用到的mysql数据库的简单操作

    1.数据库连接 1.1用windows命令行链接数据库服务器 几个DOS命令 在DOS环境下命令后面没有分号,在MySQL环境下,命令后面有分号 进入盘符: 语法:盘符: 进入盘符下的某个文件夹 语法 ...

  3. BZOJ2243 (树链剖分+线段树)

    Problem 染色(BZOJ2243) 题目大意 给定一颗树,每个节点上有一种颜色. 要求支持两种操作: 操作1:将a->b上所有点染成一种颜色. 操作2:询问a->b上的颜色段数量. ...

  4. Objective-C--- 多态 、 协议

    1 编写交通工具程序 1.1 问题 本案例需要创建一个TRTransportation类,类中有一个方法叫print的方法,该方法默认输出 “显示交通工具信息”,这个类作为父类,派生出三个子类TRTa ...

  5. 《more effective c++》条款26 限制类对象的个数

    问题: 如何限制类对象的个数?比如1个,10个等等. 方法(1): 将类的构造函数定义为private,那么就无法实例化这个类了.但是如何创建1个对象出来?方法有2种: 1.声明一个友元函数,那么在友 ...

  6. 用中文把玩Google开源的Deep-Learning项目word2vec

    google最近新开放出word2vec项目,该项目使用deep-learning技术将term表示为向量,由此计算term之间的相似度,对term聚类等,该项目也支持phrase的自动识别,以及与t ...

  7. Hive on Spark运行环境搭建

    Hive是基于Hadoop的开源数据仓库工具,提供了类似于SQL的HiveQL语言,使得上层的数据分析人员不用知道太多MapReduce的知识就能对存储于Hdfs中的海量数据进行分析.由于这一特性而收 ...

  8. WinEdt和TeXworks编辑LaTeX文件乱码问题

    WinEdt默认使用的是系统编码,windows下可以认为是 GBK编码,而TeXworks默认使用的是UTF8编码,所以要统一这两个编码,才能保证两个文件互相打开不会乱码. 具体方法如下: 一,可以 ...

  9. debug进入线程中

    今天debug调试程序时,怎么也进入不了线程中,f5直接进源码,f6直接跳过了,后来把断点打在线程的Run()方法里面,按f8(可能要多按几次)就可以了.

  10. 7. Reverse Integer java

    Reverse digits of an integer. Example1: x = 123, return 321Example2: x = -123, return -321 代码如下: pub ...