一、基础内容
- 什么是委托? 委托的作用? (略)
- 自定义委托的声明: 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 }