zoukankan      html  css  js  c++  java
  • c# 委托内容进阶

    一、基础内容

    1. 什么是委托? 委托的作用? (略)
    2. 自定义委托的声明: Public Delegate [Type]  Mydel() ;   
    3. 显示委托===> 匿名委托 ===> Lambda表达式   (略)
    4. 内置委托类型:Action<> 、Func<> 、Predicate<>  (略)

    二、进阶内容

    1. 多播委托
    • 多播委托的添加 + / += 运算符。
    • 多播委托的移除 - / -= 运算符 。
    • 添加的方法:Combine( ),与+ / += 等效;
    • 移除的方法:Remove( ),   与- / -= 等效;
    • 注意:多播委托的返回类型不是void类型时,只能获取最后一个被调用方法的返回值,前面的所有方法会被抛弃。

              2. DynamicInvoke() 方法 

                 动态调用(后期绑定的)当前委托列表中的所有方法。 可以依次全部调用 ,也可以指定调用其中的某一条。

              3. GetInvocationList() 方法

                  获取委托列表中的方法,以数组形式输出。public virtual Delegate[ ] GetInvocationList ();    

                 2与3这两个方法可以配合使用,先获得数组表示的方法,再分别动态输出方法。见下面的示例。

     1 class Program
     2     {
     3         //用内置的Action<>委托类型,声明一个带参数的 "委托实例 MyAction"
     4         static void Main( string [ ] args )
     5         {
     6             Action<string>  MyAction = null;
     7             //再把另外两个方法添加到 MyFunc列表中,让MyFunc列表有三个方法
     8             MyAction += method1;
     9             MyAction += method2;
    10             MyAction += method3;
    11 
    12             //直接调用MyFunc列表,显示列表中的所有方法。
    13             MyAction ("火星王子");
    14 
    15             //动态调用列表中的方法,可以分别赋值;
    16            
    17             Delegate [ ] Arr = MyAction.GetInvocationList ();  //先获取委托列表数组
    18             Console.WriteLine ( "委托列表中一共有【{0}】个方法 
    ",Arr.Length );  //列表中方法的个数
    19             //
    20             Console.WriteLine ( "委托列表MyActoin中的方法如下:
    " ); //输出列表中的所有方法
    21             foreach (Delegate  dd  in Arr)
    22             {
    23                 Console.WriteLine (dd.Method );
    24             }
    25             Console.WriteLine ();
    26             //
    27             //用DynamicInvoke()方法动态调用单独一个方法
    28             Arr [ 0 ].DynamicInvoke (" 张三 ");
    29             Arr [ 1].DynamicInvoke ( " Lucy " );
    30             MyAction.GetInvocationList ()[2].DynamicInvoke(" 火星王子 ");  //这个写法等于Arr[2].DynamicInvoke();
    31             
    32             Console.ReadKey ();
    33        }
    34              
    35       //显示声明三个方法 mehod1  method2 method3
    36         public static void method1(string name)
    37         {
    38             Console.WriteLine ($"我是中国人,我的名字是{name},请多指教,第一个方法。");
    39         }
    40         //
    41         public static void method2( string name )
    42         {
    43             Console.WriteLine ( $"我是英国人,我的名字是{name},请多指教,第二个方法。" );
    44         }
    45         //
    46         public static void method3( string name )
    47         {
    48             Console.WriteLine ( $"我是火星人,我的名字是{name},请多指教,第三个方法。" );
    49         }
    50         }
    View Code

              4. GetMethodInfo()方法      ---此方法命名空间为:System.Reflection;

                  获取委托列表中方法的对象。(对象:属性、名称、限定词等)

                  下面演示Name 、 IsStatic 、ReturnType 、 Attributes 四个属性。 分别对应四种类型。

     1  class Program
     2     {
     3         //用内置的Action<>委托类型,声明一个带参数的 "委托实例 MyAction"
     4         static void Main( string [ ] args )
     5         {
     6             Action<string>  MyAction = null;
     7             //再把另外两个方法添加到 MyFunc列表中,让MyFunc列表有三个方法
     8             MyAction += method1;
     9             MyAction += method2;
    10             MyAction += method3;
    11 
    12             Delegate [ ] Arr = MyAction.GetInvocationList ();  //获取委托列表数组
    13              //若不用数组,也可用完整写法: MyAction.GetInvocationList () [ 0 ].GetMethodInfo ().Name ;
    14              //为代码简明方便,用数组表示。 以列表中第一个方法为例,其索引值为0 ;
    15              //
    16             string ss = Arr [ 0 ].GetMethodInfo ().Name;          // 这个方法的名字
    17             Type tt  = Arr [ 0 ].GetMethodInfo ().ReturnType;  // 这个方法的返回类型
    18             bool bb = Arr [ 0 ].GetMethodInfo ().IsStatic;         // 这个方法是不是静态的
    19             MethodAttributes mm = Arr [ 0 ].GetMethodInfo ().Attributes;   //获得与这个方法关联的属性,是一个MethodAttributes 枚举值。
    20 
    21             Console.WriteLine ( $"委托列表中第一个方法为{Arr [ 0 ].Method},
    
    名字为:{ss},  返回类型为:{tt},  静态布尔值为:{bb}。" );
    22             Console.WriteLine ( $"
    这个方法的相关属性为:{mm}" );
    23 
    24             Console.ReadKey ();
    25        }           
    26       //显示声明三个方法 mehod1  method2 method3
    27         public static void method1(string name)
    28         {    Console.WriteLine ($"我是中国人,我的名字是{name},请多指教,第一个方法。");  }
    29         //
    30         public static void method2( string name )
    31         {  Console.WriteLine ( $"我是英国人,我的名字是{name},请多指教,第二个方法。" ); }
    32         //
    33         public static void method3( string name )
    34         { Console.WriteLine ( $"我是火星人,我的名字是{name},请多指教,第三个方法。" ); }
    35       }
    View Code
  • 相关阅读:
    中缀表达式转换为后缀表达式
    看4S员工自爆!黑啊,太黑了
    解剖孩子晚上磨牙的6大原因
    2D 3D IMAX 电影座位选择
    蒸鸡蛋羹
    0010 4S店提车注意事项
    2012年北京市车船税基准税额
    火车票预订 电话 和 网站
    远程计算机关机方法
    win7 用户信息丢失
  • 原文地址:https://www.cnblogs.com/FengTime/p/12512317.html
Copyright © 2011-2022 走看看