代わりに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();
}
}
これを行うためのより良い方法はありますか?