C# 运行时条件属性
我希望获得与.Net framework的ConditionalAttribute类似的结果,只是该条件必须在运行时进行计算。目前,我已经删除了一些原型代码(使用PostSharp),但有一个缺点——它修改了方法体,而不是调用站点。因此,在下面的示例中,GetArg()方法被调用了2次,但所需的效果是只应第一次调用它C# 运行时条件属性,c#,code-generation,postsharp,C#,Code Generation,Postsharp,我希望获得与.Net framework的ConditionalAttribute类似的结果,只是该条件必须在运行时进行计算。目前,我已经删除了一些原型代码(使用PostSharp),但有一个缺点——它修改了方法体,而不是调用站点。因此,在下面的示例中,GetArg()方法被调用了2次,但所需的效果是只应第一次调用它 [Serializable] public abstract class RuntimeConditionalAttribute : OnMethodBoundar
[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,但我正在寻找任何可以满足我需要的东西。(除了我自己编写编译器加载项代码来进行这种修改之外)