程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#高級程序設計(四)——代理中的Method Group轉換

C#高級程序設計(四)——代理中的Method Group轉換

編輯:C#入門知識

在前面代理對象初始化中提到過Method Group特性,C#編譯器能將method  group隱式轉換成其兼容的代理對象。例如:
[csharp]
Feedback fbInstance = FeedbackToFile; 

method group是一組方法的名稱,之所以被稱為方法組,是因為方法具有重載的特性,每個方法名稱都可能有若干的signature。例如:
[csharp] 
void MyMethod() 
void MyMethod(object sender, EventArgs e) 

可以使用MyMethod作為方法組賦值給ThreadStart代理對象或者EventHandler代理對象。
[csharp] 
ThreadStart x = MyMethod; 
EventHandler y = MyMethod; 

但是,你不能將MyMethod作為參數傳遞給即接受ThreadStart又接受EventHandler作為參數的重載函數,編譯器會報具有二義性的錯誤。
同樣,你也不能將method group隱式轉換成System.Delegate類型的對象,因為編譯器不知道用哪種子代理類型去創建代理對象。解決的辦法是通過顯式類型轉換。
[csharp] 
Delegate invalid = SomeMethod; 
Delegate valid = (ThreadStart)SomeMethod; 

此外,以可以通過包裝器來做這種轉換,例如Control.Invoke是只接受System.Delegate類型作為參數,因此,可以有下面幾種方式來使用Method group。
[csharp] 
static void SimpleInvoke(Control control, 
MethodInvoker invoker) 
{ www.2cto.com
control.Invoke(invoker); 

... 
SimpleInvoke(form, UpdateUI); 
form.Invoke((MethodInvoker)UpdateUI); 
MethodInvoker invoker = UpdateUI; 
form.Invoke(invoker); 

  1. 上一頁:
  2. 下一頁: