【发布时间】:2011-03-09 05:22:02
【问题描述】:
我正在尝试通过使用 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();
}
}
有没有更好的方法来做到这一点?
【问题讨论】:
-
在这里使用partial methods 对您有用吗?
-
我觉得如果您尝试对接口执行此操作,您可能在某处有一个泄漏的抽象。跟踪信息可能更多的是实现细节而不是合同细节。
-
@ROMANARMY:是的,这是一个非常糟糕的界面。我只是想一步一步地对其进行消毒。
-
+1 @ROMANARMY。跟踪方法不应出现在接口上,因为它是实现细节。但是,如果您坚持使用它,我会使用您开始使用的 #if ... #endif 方法。
-
@Xcaliburp。是的,我想我会坚持使用#if,直到我完全从界面中删除与跟踪相关的内容。 (如果您在回复中发布,我会接受。)