Я бы сказал, что проблема не в этом классе.Этот класс просто симптом.Проблема в базовом классе, который вызывает BeforeAdd.Если вы можете выполнить рефакторинг там, вам не понадобятся условные компиляции.
Если у вас есть конфликтующие имена и пространства имен, вы можете обойти это с помощью ключевого слова using (а не слова для сборок).
Так что вы можете сделать что-то вроде
using LegacyLogEntity = Some.Fully.Qualified.Namespace.LogEntity;
using SomeOtherLogEntity = Some.Other.Fully.Qualified.Namespace.CurrentLogEntity;
// ..
LegacyLogEntity entity = new LegacyLogEntity();
Я также думаю, что проблема в базовом классе, а не в этом классе как таковом.
В этом случае вы можете получитьвокруг этой чепухи, используя либо адаптацию, либо взаимодействие.
Я не знаю, как называется другой класс, но давайте скажем, что он называется EntityAggregator.
public interface IEntity {
DateTime InsertionTime { get; set; }
}
тогда в вашем агрегатореБазовый класс:
protected virtual void BeforeAdd(IEntity entity)
{ // whatever
}
, затем в вашем подклассе:
protected override void BeforeAdd(IEntity entity)
{
entity.DateTime = DateTime.Now;
base.BeforeAdd(entity);
}
Теперь вы можете адаптировать другие объекты к IEntity путем реализации этого интерфейса.
Когда я смотрюв этом коде меня также поразило, что, возможно, вы используете события вместо этого кода.
Теперь, если вы говорите о многоцелевой компиляции, где код компилируется в двух отдельных местах под двумяЕсли различные условия, то вы можете сделать это более изящно, используя частичные классы.
Вы изолируете код CONDITION_1 в нечто вроде этого:
// in file WhateverYourClassIs.condition1.cs
#if !CONDITION_1
#error this file should never be included in a build WITHOUT CONDITION_1 set
#endif
public partial class WhateverYourClassIs {
protected override void BeforeAdd(LogEntity entity) {
entity.DateTimeInsert = DateTime.Now;
base.BeforeAdd(entity);
}
}
// in file WhateverYourClassIs.NotCondition1.cs
#if CONDITION_1
#error this file should never be included in a build WITH CONDITION_1 set
#endif
public partial class WhateverYourClassIs {
protected override void BeforeAdd(AbstractBusinessEntity entity) {
((LogEntity)entity).DateTimeInsert = DateTime.Now;
base.BeforeAdd(entity);
}
}
Мне не нравится это в этом случае, потому чтоповторения кода.Вы можете помочь с использованием ключевого слова using:
#if CONDITION_1
using MyAbstractBusinessEntity = LogEntity;
#else
using MyAbstractBusinessEntity = AbstractBusinessEntity;
#endif
// ...
protected override void BeforeAdd(MyAbstractBusinessEntity entity)
{
// in CONDITION_1, the case is a no-op
((LogEntity)entity).DateTimeInsert = DateTime.Now;
base.BeforeAdd(entity);
}