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