2015-12-16 4 views
0

Кто-нибудь использовал атрибут PostSharp Disposable?PostSharp Одноразовый атрибут

В документации http://doc.postsharp.net/disposable#customize приведен пример. В последнем разделе показан способ настройки логики удаления (код из приведенного ниже примера), но он не компилируется (предполагается, что Formatter является System.Runtime.Serialization.Formatter). Calling base.Dispose результаты в ошибке компилятора «объект» не содержит определения для «Dispose». Я читаю этот пример неправильно? Каким образом можно настроить метод удаления?

[Disposable] 
public class MessageFormatter : Formatter 
{ 

    [Child] 
    MessageSink sink; 

    public bool IsDisposed { get; private set; } 

    protected virtual void Dispose(bool disposing) 
    { 
    base.Dispose(disposing); 

    this.IsDisposed = true; 
    } 
} 

Для классов, где логик Dispose не настроен (больше коды из приведенного ниже примера), метод Dispose не доступен для вызова (HomeMadeLogger.Dispose не существует).

[Disposable] 
public class HomeMadeLogger 
{ 
    [Child] 
    public AdvisableCollection<Context> LoggingContexts { get; set; } 
} 

Я нашел эту статью, в которой кратко обсуждает Одноразовая атрибут: http://www.codeproject.com/Articles/774482/PostSharpin-Part. Он отмечает, что

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

var order = new Order { Id = 1, OrderDate = DateTime.Now }; 
using (order as IDisposable) 
{ 
    ... 
} 

Этот метод использования отлично работает. Есть ли способ явно утилизировать?

+0

Несомненно, сделайте свой метод Dispose() * общедоступным *. –

+0

Это было бы хорошо для настраиваемой логики, но пример настраиваемой логики не будет компилироваться. Нестандартная логика не имеет метода Dispose в вашем классе, она обрабатывается атрибутом. – mslissap

ответ

1

Неверная страница документации (для этого я указал внутреннюю ошибку). Вы не должны вызывать base.Dispose, если вы объявляете виртуальный метод, только если вы переопределите тот же виртуальный метод в базовом классе.

Чтобы вызвать общественный метод утилизации, используйте ((IDisposable)order).Dispose() или Post.Cast<Order,IDisposable>(order).Dispose(). Вторая конструкция выглядит странно, но она проверяется во время сборки.

+0

Спасибо за ваш ответ! – mslissap

Смежные вопросы