当前位置:编程学习 > C#/ASP.NET >>

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# ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,