.NET中的Conditional Attribute允许您在编译时禁用方法调用。我正在寻找基本相同的东西,但在运行时。我觉得这样的东西应该存在于AOP框架中,但是我不知道这个名字,所以我很难搞清楚它是否受支持。
作为一个例子,我想做这样的事情
[RuntimeConditional("Bob")]
public static void M() {
Console.WriteLine("Executed Class1.M");
}
//.....
//Determines if a method should execute.
public bool RuntimeConditional(string[] conditions) {
bool shouldExecute = conditions[0] == "Bob";
return shouldExecute;
}
因此,在代码中,只要调用 M 方法,就会首先调用 RuntimeConditional 并传入 Bob 以确定是否应该执行 M 。
答案 0 :(得分:5)
您实际上可以使用PostSharp来做您想做的事情。
以下是您可以使用的简单示例:
[Serializable]
public class RuntimeConditional : OnMethodInvocationAspect
{
private string[] _conditions;
public RuntimeConditional(params string[] conditions)
{
_conditions = conditions;
}
public override void OnInvocation(MethodInvocationEventArgs eventArgs)
{
if (_conditions[0] == "Bob") // do whatever check you want here
{
eventArgs.Proceed();
}
}
}
或者,由于您只是在查看“方法”执行之前,您可以使用OnMethodBoundaryAspect
:
[Serializable]
public class RuntimeConditional : OnMethodBoundaryAspect
{
private string[] _conditions;
public RuntimeConditional(params string[] conditions)
{
_conditions = conditions;
}
public override void OnEntry(MethodExecutionEventArgs eventArgs)
{
if (_conditions[0] != "Bob")
{
eventArgs.FlowBehavior = FlowBehavior.Return; // return immediately without executing
}
}
}
如果您的方法有返回值,您也可以处理它们。 eventArgs
具有可设置的returnValue
属性。
答案 1 :(得分:0)
我相信这将是一种非常简单的方式来做你所描述的:
public static void M()
{
if (RuntimeConditional("Bob"))
{
Console.WriteLine("Executed Class1.M");
}
}
由于