1

実行時に条件を評価する必要があることを除いて、.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());
        }
4

0 に答える 0