Вы можете использовать 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
, которое можно установить.