実行時に条件を評価する必要があることを除いて、.Net フレームワークの ConditionalAtribute と同様の結果を達成したいと考えています。現在、私はいくつかのプロトタイプ コード (PostSharp を使用) を一掃しましたが、これには 1 つの欠点があります。呼び出しサイトではなくメソッド本体を変更します。したがって、次の例では、GetArg() メソッドが 2 回呼び出されますが、目的の効果は、最初にのみ呼び出されることです。
[Serializable]
public abstract class RuntimeConditionalAttribute : OnMethodBoundaryAspect
{
public abstract bool Enabled { get; set; }
public override void OnEntry(MethodExecutionArgs args)
{
if (!Enabled)
args.FlowBehavior = FlowBehavior.Return;
}
}
[Serializable]
public class ConditionalTest : RuntimeConditionalAttribute
{
public static bool enabled = true;
public override bool Enabled
{
get { return enabled; }
set { enabled = value; }
}
}
private static string GetArg()
{
Trace.WriteLine("GetArg()");
return "";
}
[ConditionalTest]
private static void SayHello(string arg)
{
Trace.WriteLine("Hello, world.");
}
static void Main()
{
ConditionalTest.enabled = true;
SayHello(GetArg());
ConditionalTest.enabled = false;
SayHello(GetArg());
}
必要なものを生成するために使用できる他の同様のコンパイラ ツールはありますか? PostSharpでそれを達成できますか?
編集:通常、生成されたコードが私の結果を達成するためにすべきことは、関数への呼び出しをifでラップすることです。これは、最初に条件を次のようにテストします:
if(ConditionalTest.enabled) // generated
{
SayHello(GetArg());
}