2013-06-24 5 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 {..} везде становится очень утомительным.

Моя проблема в том, что я не знаю, какая функция передачи управления была фактически вызвана. Если я попробую if(ctrlXferFunction == CtrlRead) a la Python или JavaScript, я получаю сообщение об ошибке, которое == не может использоваться между группой методов и 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) 
{ 
    // ... 
}