在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)//事件的执行,注意:这才是事件的执行语句。
}