一、基礎內容
- 什么是委托? 委托的作用? (略)
- 自定義委托的宣告: 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 }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},\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 }View Code
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/61610.html
標籤:C#
上一篇:C#值型別與參考型別
