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