zoukankan      html  css  js  c++  java
  • [转载]在C#事件处理中灵活应用泛型

    在.NET 1.1中处理事件时很麻烦的事情。比如创建下面这个类:

     [Serializable]
        public class LogEntry
        {
            private string iD;

            /// <summary>
            /// 事件ID
            /// </summary>
            public string ID
            {
                get { return iD; }
                set { iD = value; }
            }
         
            string message;

            /// <summary>
            /// 事件内容
            /// </summary>
            public string Message
            {
                get { return message; }
                set { message = value; }
            }
     }
     等你需要把LogEntry当成参数传递时,就需要创建两个新的类型LogEntryArgs和LogEntryEventHandler.分别定义如下:
     public class LogEntryArgs:EventArgs
     {
      private LogEntry entry;
      public LogEntryArgs(LogEntry entry)
      {
       this.entry = entry;
      }
      public LogEntry Entry
      {
       get { return entry;}
      }
     }
     
     public delegate void LogEntryEventHandler(object sender, LogEntryArgs e);
     
     如果系统中参数比较多,这种重复劳动工作量就很多,导致系统的类型增加。我们可以使用.NET 2.0 中的泛型克服这个问题。
     1. 首先为参数定义一个公用的泛型类型:
     public class TEventArgs<T>:EventArgs
        {
            public TEventArgs(T param)
            {
                this.param = param;
            }

            T param;

            public T Param
            {
                get { return param; }
            }

        }
     2. 然后就可以使用框架自带的EventHandler<>类创建事件:
     public event EventHandler<TEventArgs<LogEntry>> LogWritten;
     
     3.使用的方法如下:
     EventHandler<TEventArgs<LogEntry>> temp = LogWritten;

     if (temp != null)
     {
      temp(this, new TEventArgs<LogEntry>(entry));
     }
     
     ##例子的完整代码如下:
     public class LogManagerImp
        {
            public void Write(LogEntry entry)
            {
                EventHandler<TEventArgs<LogEntry>> temp = LogWritten;

                if (temp != null)
                {
                    temp(this, new TEventArgs<LogEntry>(entry));
                }
            }

            public event EventHandler<TEventArgs<LogEntry>> LogWritten;

            #endregion
        }

  • 相关阅读:
    找水王续
    大道至简-阅读笔记01
    第二阶段冲刺(第二天)
    第二阶段冲刺(第一天)
    找小水王
    《大道至简》阅读笔记02——关于项目经理
    学习进度第十二周
    找水王
    学习进度第十一周
    博客园用户体验
  • 原文地址:https://www.cnblogs.com/fx2008/p/2244027.html
Copyright © 2011-2022 走看看