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;
}

我使用委托而不是一些指示方向的参数的原因是它ctrlXferFunction被多次调用并且if {..} else {..}在任何地方使用变得非常乏味。

我现在的问题是我不知道实际调用了哪个控制传递函数。如果我尝试if(ctrlXferFunction == CtrlRead)使用 la Python 或 JavaScript,则会收到==无法在方法组和 CtrlTransfer 之间使用的错误。

有没有办法知道实际调用了哪个函数?

(如果我犯了任何术语错误,我深表歉意。我是 C# 新手)

4

2 回答 2

3

您可以Method在委托上使用该属性:

if( ctrlXferFunction.Method.Name == "CtrlRead" ) ...
于 2013-06-24T05:30:12.940 回答
1

如果我在你里面,我会使用接口而不是委托。这将导致更容易检索有关呼叫者的信息。

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)
{
  // ...
}
于 2013-06-24T05:36:10.407 回答