在項目中我們經常會使用到委托,委托是多播的,如果控制不好反覆註冊就會多次觸發,可以使用委托的單例模式去註冊,這樣可以避免多次觸發問題。 下麵是幾種委托實例代碼: 帶參數委托管理: /// <summary> /// 帶參數的委托管理 /// </summary> public class Actio ...
在項目中我們經常會使用到委托,委托是多播的,如果控制不好反覆註冊就會多次觸發,可以使用委托的單例模式去註冊,這樣可以避免多次觸發問題。
下麵是幾種委托實例代碼: 帶參數委托管理:/// <summary> /// 帶參數的委托管理 /// </summary> public class ActionManager<T> { /// <summary> /// 用於存放ViewModel之間的委托 /// </summary> public static Dictionary<string, Action<T>> _actions = new Dictionary<string, Action<T>>(); /// <summary> /// 註冊委托 /// </summary> /// <param name="name">委托名稱</param> /// <param name="action">委托</param> public static void Register(string name, Action<T> action) { // 如果沒有委托才註冊,如果有不能註冊,以防止重覆註冊 lock (_actions) { if (!_actions.ContainsKey(name)) _actions.Add(name, action); } } /// <summary> /// 執行委托方法 /// </summary> /// <param name="name">委托名稱</param> public static void Invoke(string name, T value) { // 執行委托方法 lock (_actions) { if (_actions.ContainsKey(name)) _actions[name].Invoke(value); } } /// <summary> /// 移除委托 /// </summary> /// <param name="name"></param> public static void Removal(string name) { lock (_actions) { if (_actions.ContainsKey(name)) _actions.Remove(name); } } }
調用方法:
ActionManager<參數>.Removal("註冊Key");
ActionManager<參數>.Register("註冊Key", 執行方法);
// 註冊委托 ActionManager<string>.Removal("updateUser"); ActionManager<string>.Register("updateUser", str => { try { Console.WriteLine(str); } catch (Exception ex) { // 需使用logNet4 記錄log日誌,這樣有助於發生異常後排查問題,委托中的異常不會拋出來。 throw; } }); // 執行委托 ActionManager<string>.Invoke("updateUser", "Hello World!");
不帶參數委托管理:
/// <summary> /// 委托管理-不帶參數 /// 用於解決ViewModel與ViewModel間的相互調用 /// </summary> public class ActionManager { /// <summary> /// 用於存放ViewModel之間的委托 /// </summary> public static Dictionary<string, Action> _actions = new Dictionary<string, Action>(); /// <summary> /// 註冊委托 /// </summary> /// <param name="name">委托名稱</param> /// <param name="action">委托</param> public static void Register(string name, Action action) { // 如果沒有委托才註冊,如果有不能註冊,以防止重覆註冊 lock (_actions) { if (!_actions.ContainsKey(name)) _actions.Add(name, action); } } /// <summary> /// 執行委托方法 /// </summary> /// <param name="name">委托名稱</param> public static void Invoke(string name) { // 執行委托方法 lock (_actions) { if (_actions.ContainsKey(name)) _actions[name].Invoke(); } } /// <summary> /// 移除委托 /// </summary> /// <param name="name"></param> public static void Removal(string name) { lock (_actions) { if (_actions.ContainsKey(name)) _actions.Remove(name); } } }
帶參數與返回值的委托管理:
/// <summary> /// 委托管理-帶參數與返回值委托管理 /// 用於解決ViewModel與ViewModel間的相互調用 /// </summary> public class FuncManager2<T> where T : class { /// <summary> /// 用於存放ViewModel之間的委托 /// </summary> static Dictionary<string, Func<T, bool>> _Funcs = new Dictionary<string, Func<T, bool>>(); /// <summary> /// 註冊委托 /// </summary> /// <param name="name">委托名稱</param> /// <param name="func">委托</param> public static void Register(string name, Func<T, bool> func) { // 如果沒有委托才註冊,如果有不能註冊,以防止重覆註冊 if (!_Funcs.ContainsKey(name)) _Funcs.Add(name, func); } /// <summary> /// 執行委托方法 /// </summary> /// <param name="name">委托名稱</param> /// <param name="value">委托參數</param> /// <returns></returns> public static bool Invoke(string name, T value) { // 執行委托方法 if (_Funcs.ContainsKey(name)) return _Funcs[name].Invoke(value); return false; } }