Не получается избежать копи-паста. Нужно что-то типа макросов
От: J-son  
Дата: 01.05.18 14:24
Оценка:
Здравствуйте, есть такой вопрос:

Предположим, что есть класс функций, которые представляют из себя, скажем так, обертки над другими функциями:

class ExtWebAPI
{
    public AParam GetParameter(string aSerialNumber, string aParameterName)
        {
            AParam ap = null;

            int count = 0;
            while (++count < _RetriesCount)
            {
                try
                {
                    ap = _Main.GetParameter(aSerialNumber, aParameterName);
                    break;
                }
                catch (Exception)
                {
                    ExceptionHandling();
                }
            }

            return ap;
        }


        public AResult OperationStart(string aSerialNumber, string PartNumber, string aOperationCode)
        {
            AResult ar = null;

            int count = 0;
            while (++count < _RetriesCount)
            {
                try
                {
                    ar = _Main.OperationStart(aSerialNumber, PartNumber, aOperationCode);
                    break;
                }
                catch (Exception)
                {
                    ExceptionHandling();
                }
            }

            return ar;
        }
}


То есть, некая функция Веб-Сервиса пытается выполниться, если неудачно, то происходит переключение между серверами и происходит повторение.

Вопрос такой:
У меня в проекте таких функций около 50 штук и выглядят они посложнее (тут просто упростил). Но видно, что все обертки по сути делают одно и то же — вызывают в цикле другую функцию.
Поэтому, хотелось бы как-то уменьшить объем кода.
Сюда просится какая-то функция, которая бы брала другую функцию как аргумент. Но сигнатуры у всех совершенно разные. Такой вариант не подходит.
Или какой-нибудь макрос, как в C++, но в C# их нет.
Есть ли какой-то способ?

Заранее спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.