Могу ли я условно контролировать вызовы методов во время выполнения с атрибутами? - PullRequest
1 голос
/ 07 августа 2009

Условный атрибут в .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;
}

Поэтому, когда бы в коде не было вызова метода M , он сначала вызвал бы RuntimeConditional и передал бы Bob , чтобы определить, является ли M должен быть выполнен.

Ответы [ 2 ]

5 голосов
/ 07 августа 2009

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

0 голосов
/ 07 августа 2009

Я считаю, что это будет очень простой способ сделать то, что вы описали:

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

Спасибо

...