在前面代理對象初始化中提到過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);