[C#]RaiseEvent Extension Method (一)
今天再調整程式中的事件,又注意到C#的事件實在是很囉唆,每次觸發事件前都要判斷一下事件處理常式是否有繫上,有繫上才能做觸發的動作。這樣的檢查動作隨著事件的增多,重複撰寫相同的邏輯會變得非常的頻繁。而在VB.NET中事件的觸發相較之下就容易得多,不需要自行判斷事件處理常式是否繫上,直接叫用RaiseEvent觸發事件就可以了。因此想說是否可以把這部分工作提出來,試了一下提出來後仍舊運行良好,這邊將其整理成擴充方法:
public static class ObjectExtension
{
public static void RaiseEvent(this object obj, EventHandler handler, EventArgs e)
{
if (handler == null)
return;
handler(obj, e);
}
public static void RaiseEvent<TEventArgs>(this object obj, EventHandler<TEventArgs> handler, TEventArgs e) where TEventArgs : EventArgs
{
if (handler == null)
return;
handler(obj, e);
}
}
使用上帶入EventHandler與事件的參數就可以了:
public event EventHandler NameChanged;
...
this.RaiseEvent(NameChanged, EventArgs.Empty);
...
完整程式碼範例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
Person Larry = new Person();
Larry.NameChanged += new EventHandler(Larry_NameChanged);
Larry.Name = "Larry";
}
static void Larry_NameChanged(object sender, EventArgs e)
{
Console.WriteLine("NameChanged...");
}
}
public static class ObjectExtension
{
public static void RaiseEvent(this object obj, EventHandler handler, EventArgs e)
{
if (handler == null)
return;
handler(obj, e);
}
public static void RaiseEvent<TEventArgs>(this object obj, EventHandler<TEventArgs> handler, TEventArgs e) where TEventArgs : EventArgs
{
if (handler == null)
return;
handler(obj, e);
}
}
class Person
{
private string _name;
public string Name
{
get
{
if (_name == null)
return string.Empty;
return _name;
}
set
{
if (_name != value)
{
_name = value;
this.RaiseEvent(NameChanged, EventArgs.Empty);
}
}
}
public event EventHandler NameChanged;
}
}
運行結果: