Избежание повторяющегося кода в нескольких похожих методах (C #) - PullRequest
0 голосов
/ 05 мая 2011

Приветствую всех!

У меня есть набор из нескольких (и, возможно, будет иметь еще десятки) очень похожих методов в C #.Все они построены по почти одинаковому шаблону:

ResultObjectType MethodX(...input parameters of various types...)
{
  nesting preparation code here...
  {
    {
      resultObject = ExternalClass.GetResultForMethodX(input parameters of MethodX);
    }
  }
  nesting result processing code here ...
  return resultObject;
}

Повторяющиеся / идентичные части: ResultObjectType, код подготовки, код обработки результатов .

Различные части: ExternalClassвызываемый метод, набор входных параметров (количество входных параметров, их типы).

Важно: я не контролирую сигнатуры метода - не могу их изменить.

Я пытаюсь избежать повторения всех блоков аналогичного кода с чем-то вроде этого:

ResultObjectType MethodX(...input parameters of various types...)
{
    return  UniversalMethod( 
                   new ExternalMethodDelegate(ExternalClass.GetResultForMethodX),
                   input parameters of MethodX...);
}

ResultObjectType UniversalMethod (Delegate d, input parameters of various types...)
{
    nesting preparation code...
    {
        {
           resultObject = 
              (d as ExternalMethodDelegate)(same input parameters as above);
        }
    }
    nesting result processing code...
    return resultObject;
}

До сих пор мне удавалось заставить его работать таким образом только в случае, когда все параметры имеют одинаковые известныевведите во время кодирования.После ряда попыток решить эту проблему с обычными делегатами, я начинаю думать, что это невозможно достичь.Даже когда мой код компилируется, он не работает во время выполнения.Любой берущий?Заранее спасибо за помощь!

Ответы [ 2 ]

2 голосов
/ 05 мая 2011

Вот пример использования обобщенных делегатов:

int MethodY(int something, int other)
{
    return UniversalMethod(() => GetResultForMethodY(something, other));
}

string MethodX(string something)
{
    return UniversalMethod(() => GetResultForMethodX(something));
}

T UniversalMethod<T>(Func<T> fetcher)
{
    T resultObject;
    //nesting preparation code here...
    {
        resultObject = fetcher();
    }
    //nesting result processing code here ...
    return resultObject;
}

Если ResultObjectType всегда одинаков, вы можете удалить все T s.

0 голосов
/ 05 мая 2011

Повторяющиеся / идентичные части: ResultObjectType, код подготовки, код обработки результатов.

Вы должны сосредоточиться, чтобы сделать эти части как можно более изолированными.

Другой подход - генерация кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...