2013-06-24 82 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) 
{ 
    // ... 
}