Получение атрибута контекста в C # - PullRequest
0 голосов
/ 20 августа 2009

По сути, я пытаюсь реализовать какой-то аспектно-ориентированное программирование бедного человека на C #. Я думал об использовании ContextAttribute, но они, кажется, будут связаны только на уровне класса. Есть ли способ, которым я могу поместить атрибут таким образом, чтобы он получал те же параметры, что и метод, который он аннотировал, или каким-либо способом доступа к контексту, в котором он был запущен?

У меня есть этот код

public void AddUser(User user)
{
    var errors = DataAnnotationsValidationRunner.GetErrors(user);
    if (errors.Any())
           throw new RulesException(errors);
    users.Add(user);
}

из которого я хотел бы извлечь первые 3 строки, чтобы у меня было что-то вроде

[Validated]
public void AddUser(User user)
{
   users.Add(user);
}

Ответы [ 2 ]

2 голосов
/ 20 августа 2009

Я думаю, что вам не хватает третьего компонента. Большинство реализаций AOP (например, Aspect # ) полагаются на прокси или перехватчик для фактического выполнения кода. В вашем сценарии вам не хватает какого-либо компонента, необходимого для того, чтобы: 1) знать, что атрибут существует в методе, и 2) запустить механизм (или стать им), необходимый для выполнения кода внутри атрибута.

К счастью, уже есть много (довольно) простых решений, доступных в открытом коде. Самым простым вариантом, о котором я могу подумать, было бы использование ткача времени компиляции, например PostSharp . Возьмите копию этого, и в примерах вы найдете несколько примеров того, что именно вы пытаетесь сделать (вас может заинтересовать OnMethodInvocationAspect).

Конечным результатом является то, что ваш код выглядит точно так же, как и в приведенном вами примере, но он также выполняет код, который вы хотите.

1 голос
/ 20 августа 2009

Не знаю точно, как должно выглядеть ваше решение, но в C # атрибуты не выполняют код, если вы их не запрашиваете (насколько я знаю). И если вы запрашиваете атрибут, у вас также есть контекст. Так что, на мой взгляд, с вашей стратегией что-то не так.

...