Избавление от директив прекомпилятора в C #

Меня попросили поддерживать некоторый код, который не является устаревшим, как я бы хотел, и он пронизан директивами компилятора, что делает его в значительной степени нечитаемым и почти нечитаемым. как ремонтопригодный. Показательный пример:

#if CONDITION_1
        protected override void BeforeAdd(LogEntity entity)
#else
        protected override void BeforeAdd(AbstractBusinessEntity entity)
#endif
        {
#if CONDITON_1
            entity.DateTimeInsert = DateTime.Now;
#else
            ((LogEntity) entity).DateTimeInsert = DateTime.Now;
#endif
            base.BeforeAdd(entity);
        }

директивы using еще красивее:

#if CONDITION_1
using CompanyName.Configuration;
#endif

#if CONDITION_2||CONDITION_1
using CompanyName.Data;
using CompanyName.Data.SqlBuilders;
#else
using CompanyName.Legacy.Database;
using CompanyName.Legacy.Database.SQLBuilders;
using CompanyName.Legacy.Database.SQLBuilders.parameterTypes;
#endif

Я думал, что попробую использовать ConditionalAttribute , но в данной ситуации это не сработает

Есть ли каким-либо образом я могу выбраться из этого кошмара директив компилятора?

Код скомпилирован для .NET 3.5 .

ОБНОВЛЕНИЕ:
Одед ответил, предлагая удалить директивы компилятора вокруг Метод BeforeAdd , таким образом, перегружает его. К сожалению, это не сработает, поскольку предполагается, что оба метода переопределяют класс AbstractBusiness , который предоставляет две разные реализации в зависимости от того, какие сборки в конечном итоге будут включены:

protected virtual void BeforeAdd(TEntity entity) {}

или

protected virtual void BeforeAdd(AbstractBusinessEntity entity) {}

. Этот код получает свои зависимости от набор библиотек, созданных компанией когда-то в прошлом и с тех пор «обновляющихся». Теперь у них есть 4 разные версии этого набора библиотек с конфликтующими пространствами имен и разными реализациями. И все во имя «обратной совместимости» с приложениями, которые используют (очень) старые версии.


ЗАКЛЮЧЕНИЕ

В итоге я выбрал ответ @ Oded, потому что он имеет наибольший смысл в качестве общего подхода ( KISS и все такое). Однако я не мог использовать его в этом случае; то, что вы видите здесь, - это лишь верхушка айсберга. Я бы не хотел ЦЕЛОВАТЬ этот код, если бы он мне платил.

6
задан Sergi Papaseit 22 March 2011 в 14:35
поделиться