日期:2014-05-18  浏览次数:20767 次

C#高级程序设计(四)——代理中的Method Group转换

在前面代理对象初始化中提到过Method Group特性,C#编译器能将method  group隐式转换成其兼容的代理对象。例如: 

Feedback fbInstance = FeedbackToFile;

method group是一组方法的名称,之所以被称为方法组,是因为方法具有重载的特性,每个方法名称都可能有若干的signature。例如: 

void MyMethod()
void MyMethod(object sender, EventArgs e)

可以使用MyMethod作为方法组赋值给ThreadStart代理对象或者EventHandler代理对象。

ThreadStart x = MyMethod;
EventHandler y = MyMethod;

但是,你不能将MyMethod作为参数传递给即接受ThreadStart又接受EventHandler作为参数的重载函数,编译器会报具有二义性的错误。

同样,你也不能将method group隐式转换成System.Delegate类型的对象,因为编译器不知道用哪种子代理类型去创建代理对象。解决的办法是通过显式类型转换。

Delegate invalid = SomeMethod;
Delegate valid = (ThreadStart)SomeMethod;

此外,以可以通过包装器来做这种转换,例如Control.Invoke是只接受System.Delegate类型作为参数,因此,可以有下面几种方式来使用Method group。

static void SimpleInvoke(Control control,
MethodInvoker invoker)
{
control.Invoke(invoker);
}
...
SimpleInvoke(form, UpdateUI);
form.Invoke((MethodInvoker)UpdateUI);
MethodInvoker invoker = UpdateUI;
form.Invoke(invoker);