C#高级程序设计(四)——代理中的Method Group转换
在前面代理对象初始化中提到过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.zzzyk.com
control.Invoke(invoker);
}
...
SimpleInvoke(form, UpdateUI);
form.Invoke((MethodInvoker)UpdateUI);
MethodInvoker invoker = UpdateUI;
form.Invoke(invoker);
补充:软件开发 , C# ,