我试图通过使用 Conditional 属性来摆脱代码中的“#if TRACE”指令,但不能轻松地将这种方法应用于接口。我有办法解决这个问题,但它非常难看,我正在寻找更好的解决方案。
例如,我有一个带有条件编译方法的接口。
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.");
}
}
这将使我的客户端代码在非 TRACE 构建中对“nop”TraceOnlyDoIt() 方法进行冗余调用。我可以通过接口上的条件扩展方法来解决这个问题,但它变得有点难看。
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();
}
}
有一个更好的方法吗?