2013-06-24 131 views
4

我使用的是授人以動態地選擇之間的許多功能,即如何知道

delegate bool CtrlTransfer(int xferLength, ref byte[] buffer); 

bool CtrlRead(int xferLength, ref byte[] buffer) 
{ /* do a read */ } 

bool CtrlWrite(int xferLength, ref byte[] buffer) 
{ /* do a write */ } 

並且這些在一個調度功能作爲

byte[] RunTest(CtrlTransfer ctrlXferFunction, /* a bunch of other args */) { 
    /* do some stuff */ 
    ctrlXferFunction(/* its arguments */); 
    /* do some more stuff */ 
    return someByteArray; 
} 

我之所以」的函數被調用m使用委託而不是一些參數指示方向是ctrlXferFunction被多次調用並且使用if {..} else {..}處處變得非常單調乏味。

我現在的問題是,我不知道實際調用哪個控制傳遞函數。如果我嘗試使用Python或JavaScript的if(ctrlXferFunction == CtrlRead),則會出現==無法在方法組和CtrlTransfer之間使用的錯誤。

有沒有辦法知道哪個函數被實際調用?

(我的道歉,如果我做任何術語錯誤我是新的C#)。

+0

你打算用這個信息呢?爲什麼不在「CtrlRead」和「CtrlWrite」函數中添加邏輯? –

+0

@KarthikT CtrlRead和Write函數只做一件事 - 在控制端點(USB)上進行讀取或寫入。最終,RunTest函數將不得不擴展以合併其他類型的讀取/寫入。並且在不同端點上執行傳輸的接口是不同的 - 因此具有不同的功能 – Manu

+0

我實際上在詢問在確定調用哪個函數後您將執行什麼操作 –

回答

3

可以使用Method財產的委託:

if(ctrlXferFunction.Method.Name == "CtrlRead") ... 
1

如果我是你,我d使用接口而不是代理。這將導致更容易的信息檢索關於什麼是調用者。

interface IMyInterface 
{ 
    bool CtrlTransfer(int xferLength, ref byte[] buffer); 
} 

然後:

class MyReader : IMyInterface 
{ 
    bool CtrlTransfer(int xferLength, ref byte[] buffer) 
    { 
    // do the read... 
    } 
} 

最後:

var reader = ctrlXferInstance as MyReader; 
if (reader != null) 
{ 
    // ... 
}