Я пытаюсь избавиться от директив "#if TRACE" в моем коде, используя вместо этого атрибут Conditional, но не могу легко применить этот подход к интерфейсам. У меня есть способ обойти это, но это довольно уродливо, и я ищу лучшее решение.
например. У меня есть интерфейс с условно скомпилированным методом.
interface IFoo
{
#if TRACE
void DoIt();
#endif
}
Я не могу использовать условный атрибут в интерфейсе:
// Won't compile.
interface IFoo
{
[Conditional("TRACE")]
void DoIt();
}
Я мог бы иметь метод интерфейса, просто вызвав условный закрытый метод в конкретном классе:
interface IFoo
{
void TraceOnlyDoIt();
}
class Foo : IFoo
{
public void TraceOnlyDoIt()
{
DoIt();
}
[Conditional("TRACE")]
void DoIt()
{
Console.WriteLine("Did it.");
}
}
Это оставило бы мой клиентский код с избыточными вызовами к методу 'nop' TraceOnlyDoIt () в сборке не TRACE. Я могу обойти это с помощью метода условного расширения интерфейса, но он становится немного уродливым.
interface IFoo
{
void TraceOnlyDoIt();
}
class Foo : IFoo
{
public void TraceOnlyDoIt()
{
Console.WriteLine("Did it.");
}
}
static class FooExtensions
{
[Conditional("TRACE")]
public static void DoIt(this IFoo foo)
{
foo.TraceOnlyDoIt();
}
}
Есть ли лучший способ сделать это?