C # создание атрибута, который указывает на выполнение кода после вызова свойства - PullRequest
6 голосов
/ 16 сентября 2009

Я бы хотел создать Атрибут для установки свойств.

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

Например:

    [MethodExecute(Log)]
    [MethodExecute(Save)]
    public string Name
    {
        get
        {
            return name;
        }
        set
        {
            name = value;
        }
    }

Здесь я хотел бы активировать два метода, один из которых зарегистрирует изменение, а другой сохранит его.

Спасибо, Ronny

Ответы [ 3 ]

6 голосов
/ 16 сентября 2009

Я полагаю, вы могли бы сделать это в PostSharp . К сожалению, вам нужно будет указать имя метода в виде строки - в C # нет оператора для преобразования имени метода в MethodInfo, хотя это предлагалось несколько раз.

Вам может потребоваться переместить атрибут, если вам нужен код для выполнения только после установщика (а не получателя):

public string Name
{ 
    get; 
    [MethodExecute("Log")] [MethodExecute("Save")] set;
}

(Для простоты используется автоматически реализованное свойство.)

3 голосов
/ 16 сентября 2009

Что вы действительно спрашиваете, есть ли в .NET framework какие-либо хуки для аспектно-ориентированного программирования (AOP). К сожалению, ответ: нет , не по умолчанию.

Существует множество платформ, которые позволяют вам это делать, но большинство требует, чтобы типы с таким оформлением создавались специализированной фабрикой.

  • Многие DI-контейнеры имеют так называемые возможности перехвата, которые позволяют вам это делать. Примером такого контейнера DI является Castle Windsor .
  • Шаблоны и практики Microsoft когда-то создали Блок приложения внедрения политики , который включает такой сценарий.
  • В более специализированных случаях вы также видите это в определенных подструктурах - например, В ASP.NET MVC есть что-то под названием ActionFilter, которое работает таким образом, но только если оно размещено в конвейере MVC.

Есть также несколько фреймворков, которые позволяют вам сделать это, изменив IL после его компиляции, но, насколько я понимаю, есть и довольно серьезные недостатки.

0 голосов
/ 16 сентября 2009

Вы также можете использовать механизм перехвата, предоставляемый Unity контейнером ввода зависимостей. В качестве примера рассмотрим Реализацию INotifyProperyChanged с перехватом Unity .

...