欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

c# 委托内容进阶

程序员文章站 2022-09-27 14:54:25
一、基础内容 什么是委托? 委托的作用? (略) 自定义委托的声明: Public Delegate [Type] Mydel() ; 显示委托 > 匿名委托 > Lambda表达式 (略) 内置委托类型:Action<> 、Func<> 、Predicate<> (略) 二、进阶内容 多播委托 多 ......

一、基础内容

  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}】个方法 \n",arr.length );  //列表中方法的个数
19             //
20             console.writeline ( "委托列表myactoin中的方法如下:\n" ); //输出列表中的所有方法
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         }

          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},\n\n名字为:{ss},  返回类型为:{tt},  静态布尔值为:{bb}。" );
22             console.writeline ( $"\n这个方法的相关属性为:{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       }