zoukankan      html  css  js  c++  java
  • C# 访问外部类中的事件

    一、回顾委托与事件的基础 (官网介绍)

      https://docs.microsoft.com/zh-cn/dotnet/csharp/delegates-overview------委托

           https://docs.microsoft.com/zh-cn/dotnet/csharp/events-overview----------事件

    二、程序设计

      myEvent类中如下 

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Threading;
     6 using System.Threading.Tasks;
     7 
     8 namespace TestThread
     9 {
    10     public class myEvent
    11     {
    12         /// <summary>
    13         /// 声明一个委托播放
    14         /// </summary>
    15         /// <param name="sender"></param>
    16         /// <param name="e"></param>
    17         public delegate void DoPlay(Object sender, EventArgs e);
    18         /// <summary>
    19         /// 声明一个事件 用来订阅播放
    20         /// </summary>
    21         public event DoPlay TestEventArgs;
    22       
    23         /// <summary>
    24         /// 声明一个触发事件的方法 用于将数据打包
    25         /// </summary>
    26         /// <param name="sender"></param>
    27         /// <param name="e"></param>
    28         public void OnTestEventArgs(Object sender, EventArgs e)
    29         {
    30             if (e != null)
    31             {
    32                 List<string> lst = new List<string>();
    33                 lst.Add("Jack");
    34                 lst.Add("LIU");
    35                 lst.Add("Peng");
    36                 lst.Add("Pick");
    37                 TestEventArgs(lst, e);
    38             }
    39         }
    40     }
    41 }
    View Code

          main方法如下

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace TestThread
    {
        class Program:myEvent
        {
            public  delegate void DoPlayGame();
            public static event DoPlayGame DoPlayGameEventHander;
    
            
            public static void Main(string[] args)
            {
               
                myEvent me = new myEvent();
                //me.TestPlayHanderEvent += Me_TestPlayHanderEvent;
                me.TestEventArgs += new DoPlay(OnDoPlay); //这里准备调用外部事件 注册事件  订阅 += 观察者
                me.OnTestEventArgs(null,new EventArgs()); //调用触发者
    
                Console.ReadKey();
            }
    
         
            /// <summary>
            /// 开始播放事件传过来的数据
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private static void OnDoPlay(object sender, EventArgs e)
            {
                foreach (string item in (List<string>)sender)
                {
                    Console.WriteLine(item);
                }
    
            }
           
        }
    }
    View Code

    三、这样设计的好处

      首先要明白一件事情:事件是多播委托,而事件(Evnet)的触发后,其要使数据传递给需要观察者(Delegate) ,则需要一个函数或者说方法去订阅,我理解该函数为订阅者(代码中的OnDoPlay)

      由此,我的理解就是在程序设计中,我们在外部类中声明了事件就可以很好地通过订阅者获取发生的”不同“事件,即实现多播委托。

      这里就不讨论委托和事件的安全级别问题了。

    四、验证多播委托

           程序验证思路:既然我认为:在外部类中声明了事件就可以很好地通过订阅者获取发生的”不同“事件。由此我在myEvnet中在声明几个要发生的事件,比如OnPlayLOL、OnPlayCF、OnPlayVX

      那么订阅者OnDoPlay就可以接收到这些事件的发生,即订阅事件的发生。运行程序:

      代码构思如下:

      TestEventArgs事件发生的方法: 

    public void OnPlayLOL(Object sender, EventArgs e)
            {
                if (e != null)
                {
                    string str = "我正在玩LOL";
                    TestEventArgs(str, e);
                }
            }
    
            public void OnPlayCF(Object sender, EventArgs e)
            {
                if (e != null)
                {
                    string str = "我正在玩CF";
                    TestEventArgs(str, e);
                }
            }
    
            public void OnPlayVX(Object sender, EventArgs e)
            {
                if (e != null)
                {
                    string str = "我正在刷微信视频号";
                    TestEventArgs(str, e);
                }
            }
    View Code

      简单修改下订阅者OnDoPlay:

    private static void OnDoPlay(object sender, EventArgs e)
            {
                if (sender is List<string>)
                {
                    foreach (string item in (List<string>)sender)
                    {
                        Console.WriteLine(item);
                    }
                }
                else
                    Console.WriteLine(sender.ToString());
    
            }
    View Code

      事件的注册不变: me.TestEventArgs += new DoPlay(OnDoPlay); 

      新增触发者的调用:
        me.OnPlayLOL(null, new EventArgs());
        me.OnPlayCF(null, new EventArgs());
        me.OnPlayVX(null, new EventArgs());

  • 相关阅读:
    python出现local variable 'f' referenced before assiginment""
    使用Python修改ifcfg-eth0文件
    在linux中运行py文件时,及时知道错误信息
    分词结果准确率、召回率计算-python
    oozie工作流
    combiner hadoop
    Python常用模块--base64
    Python常用模块--datetime
    树莓派(Raspbian系统)中使用pyinstaller封装Python代码为可执行程序
    LeetCode刷题笔记--Python--28. 实现strStr()
  • 原文地址:https://www.cnblogs.com/LiuL123-321/p/13141935.html
Copyright © 2011-2022 走看看