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
        }

  • 相关阅读:
    android开发中调用python代码(带参数)
    安卓开发中实现自动点击功能、获取网络信息’-博客新人初来乍到,欢迎大佬多多指教。
    一文读懂 Spring Boot、微服务架构和大数据治理三者之间的故事
    EditText搜索关键字,返回结果匹配关键字改变颜色
    Android studio无法创建类和接口问题解决办法。提示 Unable to parse template "Class"
    我的主页
    博客园美化-coffee
    apple面容、指纹验证使用
    iOS数据库FMDB操作
    UIBezierPath绘图基础教程
  • 原文地址:https://www.cnblogs.com/fx2008/p/2244027.html
Copyright © 2011-2022 走看看