翼度科技»论坛 编程开发 .net 查看内容

委托的单例模式

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21
 在项目中我们经常会使用到委托,委托是多播的,如果控制不好反复注册就会多次触发,可以使用委托的单例模式去注册,这样可以避免多次触发问题。
下面是几种委托实例代码:带参数委托管理:
  1. /// <summary>
  2. /// 带参数的委托管理
  3. /// </summary>
  4. public class ActionManager<T>
  5. {
  6. /// <summary>
  7. /// 用于存放ViewModel之间的委托
  8. /// </summary>
  9. public static Dictionary<string, Action<T>> _actions = new Dictionary<string, Action<T>>();
  10. /// <summary>
  11. /// 注册委托
  12. /// </summary>
  13. /// <param name="name">委托名称</param>
  14. /// <param name="action">委托</param>
  15. public static void Register(string name, Action<T> action)
  16. {
  17. // 如果没有委托才注册,如果有不能注册,以防止重复注册
  18. lock (_actions)
  19. {
  20. if (!_actions.ContainsKey(name))
  21. _actions.Add(name, action);
  22. }
  23. }
  24. /// <summary>
  25. /// 执行委托方法
  26. /// </summary>
  27. /// <param name="name">委托名称</param>
  28. public static void Invoke(string name, T value)
  29. {
  30. // 执行委托方法
  31. lock (_actions)
  32. {
  33. if (_actions.ContainsKey(name))
  34. _actions[name].Invoke(value);
  35. }
  36. }
  37. /// <summary>
  38. /// 移除委托
  39. /// </summary>
  40. /// <param name="name"></param>
  41. public static void Removal(string name)
  42. {
  43. lock (_actions)
  44. {
  45. if (_actions.ContainsKey(name))
  46. _actions.Remove(name);
  47. }
  48. }
  49. }
复制代码
  调用方法:
ActionManager.Removal("注册Key");
ActionManager.Register("注册Key", 执行方法);
  1. // 注册委托
  2. ActionManager<string>.Removal("updateUser");
  3. ActionManager<string>.Register("updateUser", str =>
  4. {
  5. try
  6. {
  7. Console.WriteLine(str);
  8. }
  9. catch (Exception ex)
  10. {
  11. // 需使用logNet4 记录log日志,这样有助于发生异常后排查问题,委托中的异常不会抛出来。
  12. throw;
  13. }
  14. });
  15. // 执行委托
  16. ActionManager<string>.Invoke("updateUser", "Hello World!");
复制代码
  不带参数委托管理:
  1. /// <summary>
  2. /// 委托管理-不带参数
  3. /// 用于解决ViewModel与ViewModel间的相互调用
  4. /// </summary>
  5. public class ActionManager
  6. {
  7. /// <summary>
  8. /// 用于存放ViewModel之间的委托
  9. /// </summary>
  10. public static Dictionary<string, Action> _actions = new Dictionary<string, Action>();
  11. /// <summary>
  12. /// 注册委托
  13. /// </summary>
  14. /// <param name="name">委托名称</param>
  15. /// <param name="action">委托</param>
  16. public static void Register(string name, Action action)
  17. {
  18. // 如果没有委托才注册,如果有不能注册,以防止重复注册
  19. lock (_actions)
  20. {
  21. if (!_actions.ContainsKey(name))
  22. _actions.Add(name, action);
  23. }
  24. }
  25. /// <summary>
  26. /// 执行委托方法
  27. /// </summary>
  28. /// <param name="name">委托名称</param>
  29. public static void Invoke(string name)
  30. {
  31. // 执行委托方法
  32. lock (_actions)
  33. {
  34. if (_actions.ContainsKey(name))
  35. _actions[name].Invoke();
  36. }
  37. }
  38. /// <summary>
  39. /// 移除委托
  40. /// </summary>
  41. /// <param name="name"></param>
  42. public static void Removal(string name)
  43. {
  44. lock (_actions)
  45. {
  46. if (_actions.ContainsKey(name))
  47. _actions.Remove(name);
  48. }
  49. }
  50. }
复制代码
  带参数与返回值的委托管理:
  1. /// <summary>
  2. /// 委托管理-带参数与返回值委托管理
  3. /// 用于解决ViewModel与ViewModel间的相互调用
  4. /// </summary>
  5. public class FuncManager2<T> where T : class
  6. {
  7. /// <summary>
  8. /// 用于存放ViewModel之间的委托
  9. /// </summary>
  10. static Dictionary<string, Func<T, bool>> _Funcs = new Dictionary<string, Func<T, bool>>();
  11. /// <summary>
  12. /// 注册委托
  13. /// </summary>
  14. /// <param name="name">委托名称</param>
  15. /// <param name="func">委托</param>
  16. public static void Register(string name, Func<T, bool> func)
  17. {
  18. // 如果没有委托才注册,如果有不能注册,以防止重复注册
  19. if (!_Funcs.ContainsKey(name))
  20. _Funcs.Add(name, func);
  21. }
  22. /// <summary>
  23. /// 执行委托方法
  24. /// </summary>
  25. /// <param name="name">委托名称</param>
  26. /// <param name="value">委托参数</param>
  27. /// <returns></returns>
  28. public static bool Invoke(string name, T value)
  29. {
  30. // 执行委托方法
  31. if (_Funcs.ContainsKey(name))
  32. return _Funcs[name].Invoke(value);
  33. return false;
  34. }
  35. }
复制代码
  

来源:https://www.cnblogs.com/wjygxjz/archive/2023/09/27/17733037.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具