c# 委托内容进阶
程序员文章站
2022-09-27 14:54:25
一、基础内容 什么是委托? 委托的作用? (略) 自定义委托的声明: Public Delegate [Type] Mydel() ; 显示委托 > 匿名委托 > Lambda表达式 (略) 内置委托类型:Action<> 、Func<> 、Predicate<> (略) 二、进阶内容 多播委托 多 ......
一、基础内容
- 什么是委托? 委托的作用? (略)
- 自定义委托的声明: public delegate [type] mydel() ;
- 显示委托===> 匿名委托 ===> lambda表达式 (略)
- 内置委托类型:action<> 、func<> 、predicate<> (略)
二、进阶内容
- 多播委托
- 多播委托的添加 + / += 运算符。
- 多播委托的移除 - / -= 运算符 。
- 添加的方法: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 }