我可以在运行时使用属性有条件地控制方法调用吗?

Bob*_*Bob 1 .net c# aop

.NET中的条件属性允许您在编译时禁用方法的调用.我正在寻找基本相同的东西,但在运行时.我觉得这样的东西应该存在于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;
}
Run Code Online (Sandbox Code Playgroud)

因此,在代码中有一个对M方法的调用,它首先调用RuntimeConditional并传入Bob以确定是否应该执行M.

Nad*_*zie 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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

或者,因为您只是在查看"之前"方法,所以您可以使用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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您的方法具有返回值,您也可以处理它们. eventArgs有一个returnValue可设置的属性.