运行时条件属性

时间:2013-07-24 14:37:30

标签: c# code-generation postsharp

我希望获得与.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());
        }

0 个答案:

没有答案