В PostSharp возможно ли изменить значение одного аргумента для метода? - PullRequest
2 голосов
/ 22 марта 2012

Мой текущий метод может ограничивать операции для работы со строками, но мне нужен более точный контроль зерна. Я хочу сделать что-то вроде, установить элементы в case title, которые будут применимы только к некоторым параметрам, но для этого мне нужно будет иметь возможность работать на уровне каждого параметра. Этот метод не позволяет проверять метаданные для отдельного параметра, например пользовательского атрибута?

(Я знаю, что есть лучшие способы обеспечить согласованный формат параметров, но это демонстрирует вопрос, на который я пытаюсь ответить).

/// <summary>
    /// Checks all string parameters on a method and trims the input if 
    /// a non null string is identified.
    /// </summary>
    [Serializable]
    public class TrimAllStringInputsAspect : MethodInterceptionAspect
    {
        public override void OnInvoke(MethodInterceptionArgs args)
        {
            for (int i = 0; i < args.Arguments.Count; i++)
            {
                var argVal = args.Arguments.GetArgument(i);

                if (argVal != null)
                {
                    if (argVal is String)
                    {
                        args.Arguments.SetArgument(i, argVal.ToString().Trim());
                    }
                }
            }

            args.Proceed();
        }
    }

1 Ответ

2 голосов
/ 22 марта 2012

MethodInterceptionAspect - единственный способ изменить входные параметры. Если вам нужен доступ к метаданным, вы можете получить MethodBase из args.Method, или лучше, вы можете реализовать правильную логику метаданных в CompileTimeInitialize и сохранить результат в поле, которое будет сериализовано с аспектом во время сборки и десериализовано в во время выполнения.

...