Estoy tratando de deshacerme de las directivas "#if TRACE" en mi código, utilizando el atributo Conditional en su lugar, pero no puedo aplicar este enfoque fácilmente a las interfaces. Tengo una forma de evitar esto, pero es bastante feo, y estoy buscando una mejor solución.Atributo condicional de C# en el miembro de interfaz
E.g. Tengo una interfaz con un método compilado condicionalmente.
interface IFoo
{
#if TRACE
void DoIt();
#endif
}
no puedo usar el atributo condicional en una interfaz:
// Won't compile.
interface IFoo
{
[Conditional("TRACE")]
void DoIt();
}
que podría tener el método de interfaz simplemente llamar a un método privado condicional en la clase concreta:
interface IFoo
{
void TraceOnlyDoIt();
}
class Foo : IFoo
{
public void TraceOnlyDoIt()
{
DoIt();
}
[Conditional("TRACE")]
void DoIt()
{
Console.WriteLine("Did it.");
}
}
Esto dejaría mi código de cliente con llamadas redundantes al método 'nop' TraceOnlyDoIt() en una compilación que no sea TRACE. Puedo solucionarlo con un método de extensión condicional en la interfaz, pero se está poniendo un poco feo.
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();
}
}
¿Hay una manera mejor de hacer esto?
¿Sería útil usar [métodos parciales] (http://msdn.microsoft.com/en-us/library/wa80x488.aspx) aquí? –
Siento que si intentas hacer esto con las interfaces, es posible que tengas una abstracción con goteras en alguna parte. La información de rastreo puede ser más un detalle de implementación que un detalle de contrato. – R0MANARMY
@Jeff M: ¿No ves cómo? – Ergwun