Описание тега postsharp

PostSharp - это расширение для C# и VB с поддержкой шаблонов, сокращающее количество шаблонного кода, задействованного в реализации шаблонов проектирования. Он основан на аспектно-ориентированном программировании и статическом анализе.

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

PostSharp работает, внедряя IL во время процесса сборки, чтобы внести аспекты в исходный метод.

Готовые выкройки

PostSharp поставляется с библиотекой готовых реализаций шаблонов, включая контракты кода, INotifyPropertyChanged, immutable, freezable и другие модели потоковой передачи.

Пример: следующий фрагмент показывает, как атрибут NotifyPropertyChanged автоматически реализует интерфейс INotifyPropertyChanged, включая прослушивание двух уровней дочерних объектов.

[NotifyPropertyChanged]
public class CustomerViewModel
{
    public CustomerModel Customer { get; set; }

    public string FullName
    {
        get
        {
            if (Customer == null) return null;

            return string.Format("{0} {1} from {2}",
                Customer.FirstName,
                Customer.LastName,
                Customer.PrincipalAddress != null ? 
                  Customer.PrincipalAddress.FullAddress : "?");
        }
    }
}

Пользовательские шаблоны

PostSharp также имеет богатый набор инструментов для автоматизации реализации ваших собственных шаблонов.

Примеры:

Отслеживание:

[PSerializable]
public class TraceAttribute : OnMethodBoundaryAspect
{
  public override void OnEntry(MethodExecutionEventArgs eventArgs)
  { 
     Trace.TraceInformation("Entering {0}.", eventArgs.Method); 
  }

  public override void OnExit(MethodExecutionEventArgs eventArgs)
  { 
     Trace.TraceInformation("Leaving {0}.", eventArgs.Method); }
  }
}

Отправка потоков WPF:

[PSerializable]
public class GuiThreadAttribute : OnMethodInvocationAspect
{
   public override void OnInvocation(MethodInvocationEventArgs eventArgs)
   {
       DispatcherObject dispatcherObject = (DispatcherObject)eventArgs.Delegate.Target;
       if (dispatcherObject.CheckAccess())
           eventArgs.Proceed();
       else
           dispatcherObject.Dispatcher.Invoke(DispatcherPriority.Normal,
                                               new Action(() => eventArgs.Proceed()));
   }
}

Применение:

[Trace]
public void CreateCustomer(int id, string name) { /* ... */ }

Установка

PostSharp проще всего установить через пакет NuGet.

Install-Package PostSharp

Лицензирование

PostSharp - это коммерческий продукт с бесплатной версией.