.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.
您实际上可以使用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可设置的属性.
| 归档时间: |
|
| 查看次数: |
1421 次 |
| 最近记录: |