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

时间:2009-08-07 01:22:33

标签: c# .net aop

.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

2 个答案:

答案 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");
   }
}

由于