Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 运行时条件属性_C#_Code Generation_Postsharp - Fatal编程技术网

C# 运行时条件属性

C# 运行时条件属性,c#,code-generation,postsharp,C#,Code Generation,Postsharp,我希望获得与.Net framework的ConditionalAttribute类似的结果,只是该条件必须在运行时进行计算。目前,我已经删除了一些原型代码(使用PostSharp),但有一个缺点——它修改了方法体,而不是调用站点。因此,在下面的示例中,GetArg()方法被调用了2次,但所需的效果是只应第一次调用它 [Serializable] public abstract class RuntimeConditionalAttribute : OnMethodBoundar

我希望获得与.Net framework的ConditionalAttribute类似的结果,只是该条件必须在运行时进行计算。目前,我已经删除了一些原型代码(使用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首先测试条件,如下所示:

        if(ConditionalTest.enabled) // generated
        {
            SayHello(GetArg());
        }

您可以将ConditionalTest放在GetArg上,但我看不出如何欺骗编译器在运行时仅使用方法上的属性不调用它。也许我的编辑会澄清我的预期,这是可以理解的。我只是不认为你能通过PostSharp实现它。您可以通过编写处理CIL并对其进行修改的内容来实现它,但这真的值得吗?“消除样板文件,提高抽象性,实施良好的设计。”我认为这是值得的。这样一来,我就少了一段代码,我可以输入错误和不正确/缺失的逻辑。它不必是PostSharp,但我正在寻找任何可以满足我需要的东西。(除了我自己编写编译器加载项代码来进行这种修改之外)