zoukankan      html  css  js  c++  java
  • 事件、委托、委托方法的总结(使用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)//事件的执行,注意:这才是事件的执行语句。

    }

  • 相关阅读:
    sql取每个分组的第一行数据
    PHP microtime() 函数
    笔记产品会不会被淘汰
    making an os NO.1 怎样进内核之二
    hjkhjkh
    HTTP协议理解
    hjkhjkh
    making an os NO.1 怎样进内核之一
    hjkhjkh
    笔记产品会不会被淘汰
  • 原文地址:https://www.cnblogs.com/suizhikuo/p/3587258.html
Copyright © 2011-2022 走看看