tags:

views:

90

answers:

2

The Conditional Attribute in .NET allows you to disable the invocation of methods at compile time. I am looking for basically the same exact thing, but at run time. I feel like something like this should exist in AOP frameworks, but I don't know the name so I am having trouble figuring out if it is supported.

So as an example I'd like to do something like this

[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;
}

So where ever in code there is a call to the M method, it would first call RuntimeConditional and pass in Bob to determine if M should be executed.

A: 

I believe this would be a very simple way of doing what you described:

public static void M() 
{
   if (RuntimeConditional("Bob"))
   {
       Console.WriteLine("Executed Class1.M");
   }
}

Thanks

mlevit
Yeah that isn't using attributes though.
Bob
+5  A: 

You can actually use PostSharp to do what you want.

Here's a simple example you can use:

[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();
        }
    }
}

Or, since you're just looking at "before" the method executes, you can use the 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
        }
    }
}

If your methods have return values, you can deal with them too. eventArgs has a returnValue property that is settable.

Nader Shirazie
Sweet, thanks! FlowBehavior is what I wanted
Bob
Cool. Though I just realised i mucked up the logic - you want FlowBehaviour.Return if the condition is *not* met.
Nader Shirazie