在講如何擷取多個傳回值之前先來看一個小例子:
private void button1_Click(object sender, EventArgs e)
{
int Number = 200; //設定Number的值為 200。
Publishser pub = new Publishser(); //執行個體化Publishser
Subscriber1 sub1 = new Subscriber1(); //執行個體化Subscriber1
Subscriber2 sub2 = new Subscriber2(); //執行個體化Subscriber2
Subscriber3 sub3=new Subscriber3(); //執行個體化Subscriber3
pub.NumberChanged += sub1.OnNumberChanged; //將方法綁定到委託
pub.NumberChanged += sub2.OnNumberChanged;
pub.NumberChanged += sub3.OnNumberChanged;
pub.DoComething(Number); //調用DoComething
}
class Publishser
{
public delegate int DemoEventHandler(int num); //定義委託,可代表的方法類型是整形
public event DemoEventHandler NumberChanged; //申明事件
public void DoComething(int temp)
{
if (NumberChanged != null)
{
temp=NumberChanged(temp);
}
MessageBox.Show(temp.ToString());
}
}
class Subscriber1
{
public int OnNumberChanged(int num)
{
MessageBox.Show("調用了Subscriber1類,num值為:"+ num);
return num + 100; ;
}
}
class Subscriber2
{
public int OnNumberChanged(int num)
{
MessageBox.Show("調用了Subscriber2類 num值為:"+num);
return num+100;
}
}
class Subscriber3
{
public int OnNumberChanged(int num)
{
MessageBox.Show("調用了Subcriber3類,num值為:"+num);
return num+100;
}
}
我以為得到的結果是:
調用了Subscriber1類,num值為:200
調用了Subscriber2類,num值為:300
調用了Subscriber3類,num值為:400
500
但是程式運行完之後結果卻不是我所想的,結果是:
調用了Subscriber1類,num值為:200
調用了Subscriber2類,num值為:200
調用了Subscriber3類,num值為:200
300
發現問題之後我用逐語句啟動並執行方式偵錯工具,我發現當NumberChanged != null 第一次調用了Subscriber1之後並沒有返回到Publishser類,也沒有執行Subscriber1的 return,而是直接調用了Subscriber2,temp的值依舊是剛開始的200。執行完之後調用Subscriber3,只有當Subscriber3執行完了之後才返回到Publishser 這個時候temp的值等於300。(現在我也不知道為什麼會這樣,但是我在網上學習了一種可以擷取多個傳回值的方法!)
---------------------------------------------------------------------------------------------------------------------------------------
擷取多個傳回值:
private void button1_Click(object sender, EventArgs e)
{
int Number = 200;
Publishser pub = new Publishser();
Subscriber1 sub1 = new Subscriber1();
Subscriber2 sub2 = new Subscriber2();
Subscriber3 sub3=new Subscriber3();
pub.NumberChanged += sub1.OnNumberChanged;
pub.NumberChanged += sub2.OnNumberChanged;
pub.NumberChanged += sub3.OnNumberChanged;
pub.DoComething(Number);
}
class Publishser
{
public delegate int DemoEventHandler(int num);
public event DemoEventHandler NumberChanged;
public void DoComething(int temp)
{
if (NumberChanged != null)
{
Delegate[] delArray = NumberChanged.GetInvocationList();
foreach (Delegate del in delArray)
{
DemoEventHandler method = (DemoEventHandler)del;
temp = method(temp);
}
}
MessageBox.Show(temp.ToString());
}
}
class Subscriber1
{
public int OnNumberChanged(int num)
{
MessageBox.Show("調用了Subscriber1類,num值為:"+ num);
return num + 100; ;
}
}
class Subscriber2
{
public int OnNumberChanged(int num)
{
MessageBox.Show("調用了Subscriber2類 num值為:"+num);
return num+100;
}
}
class Subscriber3
{
public int OnNumberChanged(int num)
{
MessageBox.Show("調用了Subcriber3類,num值為:"+num);
return num+100;
}
}
運行得到的結果是:
調用了Subscriber1類,num值為:200
調用了Subscriber2類,num值為:300
調用了Subscriber3類,num值為:400
500
現在就是我想到的結果了,利用Delegate 基類的GetInvocationList()靜態方法,可以得到委託鏈表,隨後遍曆委託鏈表依次執行,就可以得到每個方法的傳回值了。