匿名事件类

前段时间做匿名委托的时候发现了一些挺好玩的事情

如果我去遍历并执行一个List<Delegate>那么我可以自由的控制是否要执行我需要的步骤

比如说List{A,B,C,D,E},A~E分别表示是否要去公园里某个景点,

那么我对这些事件进行穷举,然后来了客人甲,他只要告诉我他想要去的几个景点

我就可以给他安排路线(比如:执行顺序CDABE)要是临时取消或者想加个景点什么的也很方便

于是,为了使得列表里存放几乎任何形式上的方法,我选择使用Func<Object[], object>

但这样会产生一个问题,那就是当我加入到List中的Delegate假设并不是Func<Object[], object>的时候怎么办?

所以我还是选择使用Delegate来表示一切形式的委托,于是就套了一个Func<>壳

这样一来我可以把任意形式上Delegate丢进Func<>里,既有返回值也能接受值

所以就出现了这个结果

//这是一个列表

public static List<Func<object[], Delegate>> delegateList = new List<Func<object[], Delegate>>

{

//这是列表里的第一个元素,并且这是一个匿名委托,形式上是Func<object[], Delegate>

//useless,形式上是Func<object[], Delegate>里的object[],不过没什么用,我还没找到必须要加这个的理由

(useless) =>
    {

//这是一个匿名委托,形式上是Delegate,这里的例子是Func<object[],object>,并不仅限于这个

Func<object[],object> function = (objs) =>
      {

//这里是返回值,形式上是Func<object[],object>里的object
        return new object();
      };

//这里是返回值,形式上是Func<in T, out TResult>中的out TResult这部分
      return function;
    },

//这是列表里的第二个元素

//这是一个匿名的委托

(useless)=>{ Func<object[],object> function = (objs) =>{return new object();};},

//这是列表里的第三个元素

//这是一个Acion的委托

(useless)=>{ Action<object[]> function = (objs) =>{};},
  };

public class MoeEvent
    {//新增一个方法,这个是插入,List里会多一个元素
        public void AddEvent(Func<object[], object> function)
        {
            if (function.GetType() == typeof(Func<object[], object>))
            {
                Func<object[], Delegate> f = (useless) => { return function; };
                MoeScript.delegateList.Add(f);
            }
        }//把function方法合并到某事件的前面,这个是多路广播,List里不会多出一个元素
        public void AddPrefixToEvent(int index, Func<object[], object> function)
        {
            if (index < MoeScript.delegateList.Count && index >= 0)
            {
                if (function.GetType() == typeof(Func<object[], object>) && MoeScript.delegateList[index].GetType() == typeof(Func<object[], Delegate>))
                {
                    Func<object[], object> oldfc = (Func<object[], object>)MoeScript.delegateList[index](new object[] { });
                    Func<object[], Delegate> fc = (useless) =>
                    {
                        Func<object[], object> newfc = function + oldfc;//区别在这里
                        return newfc;
                    };
                    MoeScript.delegateList[index] = fc;
                }
            }
        }//把function方法合并到某事件的后面,这个是多路广播,List里不会多出一个元素
        public void AddSuffixToEvent(int index, Func<object[], object> function)
        {
            if (index < MoeScript.delegateList.Count && index >= 0)
            {
                if (function.GetType() == typeof(Func<object[], object>) && MoeScript.delegateList[index].GetType() == typeof(Func<object[], Delegate>))
                {
                    Func<object[], object> oldfc = (Func<object[], object>)MoeScript.delegateList[index](new object[] { });
                    Func<object[], Delegate> fc = (useless) =>
                    {
                        Func<object[], object> newfc = oldfc + function;//区别在这里
                        return newfc;
                    };
                    MoeScript.delegateList[index] = fc;
                }
            }
        }
    }
时间: 2024-11-18 15:05:21

匿名事件类的相关文章

iOS:触摸控件UITouch、事件类UIEvent

UITouch:触摸控件类   UIEvent:事件类 ??????UITouch的介绍?????? 一.触摸状态类型枚举 typedef NS_ENUM(NSInteger, UITouchPhase) { UITouchPhaseBegan,             // 开始触摸 UITouchPhaseMoved,             // 触摸移动 UITouchPhaseStationary,       // 触摸没有移动 UITouchPhaseEnded,        

需求:利用选项事件类,使用选择框设置文本区的字形与颜色

代码: 1 package unit13; 2 import javax.swing.*; 3 4 import java.awt.Color; 5 import java.awt.FlowLayout; 6 import java.awt.Font; 7 import java.awt.event.ItemEvent; 8 import java.awt.event.ItemListener; 9 public class app3 extends JFrame implements Item

定义事件类,该事件类必须继承

创建自定义事件的步骤:定义事件类,该事件类必须继承自wx.PyCommandEvent,并定义get和set方法来获取和设置事件参数.创建一个事件类型和一个绑定器对象去绑定该事件到特定的对象.创建自定义事件对象,设置事件参数,并且使用ProcessEvent()方法将这个实例引入事件处理系统.绑定自定义事件的event handler.在event handler中响应事件.代码: #!/usr/bin/env python#coding=utf-8import wx class MyTestE

接口、接口优点、接口的属性和方法特性、接口与继承的区别、接口与抽象类的区别、匿名实现类、JDK1.8新特性、打印类名称

接口里的属性,必须是公共的/默认的&静态的&Final&初始化后的属性: 接口里所有方法都是抽象的. 接口和继承---先天有的用继承,后天学习的用接口: 接口特性-------- 1.接口不可以被实例化: 2.实现类必须实现接口中所有方法,否则实现类必须是抽象类 3.实现类可以实现多个接口,来弥补Java不能多继承: 4.接口中的变量都是静态常量:(静态的-可以通过类的名字点-直接调用:) ----------------------------------------------

JavaSE 键盘事件类(KeyEvent)实现

{相关信息}键盘事件类(KeyEvent)是容器内的任意组件获得焦点时,组件发生键击事件,当按下释放或键入某一个键时,组件对象将产生该事件.使用键盘事件必须给组件添加一个KeyListener 接口的事件处理器,该接口包含以下 3 个方法:void keyPressed(KeyEvent e):按下按键时发生.void keyReleased(KeyEvent e):松开按键时发生.void keyTyped(KeyEvent e):敲击键盘,发生在按键按下后,按键放开前. {效果图} {实现代

事件类

Java事件处理机制的核心是代表事件的类,每个事件类均提供互相一致而又易用的封装事件的方法.Java事件类层次结构的根节点是java.util.EventObject类,被封装于java.util包中.它的一个构造方法是EventObject(Object src),src是一个可产生事件的对象.getSource()返回事件源. 1 ActionEvent类 只包含一个事件,即执行动作事件ACTION_PERFORMED(java中,事件用静态常量表示,相当于Windows中的消息),这个事件

JavaSE 项目事件类(ItemEvent)

{相关信息}项目事件类(ItemEvent)是指某一个项目被选定.取消的语义事件.选择 CheckBox.ComboBox.List .Choice等组件的时候将产生项目事件.使用项目事件必须给组件添加一个实现ItemListener 接口的事件处理器,该接口的方法如下:void itemStateChange(ItemEvent e) {具体实例描述}功能描述,每选中一个项目便在文本区显示相关信息,如下: {具体实例代码} package sup.orange.learn; import ja

Java 界面-焦点事件类

[ 相关信息]焦点事件类(FocusEvent)是指用户程序界面的组件失去焦点(即焦点从一个对象转移到另外一个对象)时,就会发生焦点事件.使用焦点事件必须给组件增加一个 FocusListener 接口的事件处理器,该接口包含以下两个方法:1)void focusGained(FocusEvent e):当获得焦点时发生.2)void focusLost(FocusEvent e):当失去焦点时发生. [具体程序实现] package sup.orange.learn; import java.

JavaSE 鼠标事件类(MouseEvent)实现

{相关信息}鼠标事件类(MouseEvent)指组件中发生的鼠标动作事件,例如按下鼠标.释放鼠标.单击鼠标.鼠标光标进入或离开组件的几何 图形.移动鼠标.拖动鼠标.当鼠标移动到某个区域或鼠标单击某个组件时就会触发鼠标事件.使用鼠标事件必须给组件添加一个MouseListener 接口的事件处理器,该接口包含以下 5 个方法:void mouseClicked(MouseEvent e):当鼠标在该区域单击时发生void mouseEntered(MouseEvent e):当鼠标进入该区域时发生