1

我想获得与 .Net 框架的 ConditionalAtribute 类似的结果,但必须在运行时评估条件。目前我已经清理了一些原型代码(使用 PostSharp),它在某种程度上这样做有一个缺点 - 它修改了方法体而不是调用站点。所以在下面的例子中,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