有没有人使用过PostSharp Disposable属性?
文档http://doc.postsharp.net/disposable#customize中有一个示例。最后一节显示了一种自定义dispose逻辑的方法(来自下面示例的代码),但它没有编译(假设Formatter是System.Runtime.Serialization.Formatter)。调用base.Dispose导致编译器错误' object'不包含' 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方法无法调用(HomeMadeLogger.Dispose不存在)。
[Disposable]
public class HomeMadeLogger
{
[Child]
public AdvisableCollection<Context> LoggingContexts { get; set; }
}
我发现这篇文章简要讨论了Disposable属性:http://www.codeproject.com/Articles/774482/PostSharpin-Part。它注意到
...要在using语句中使用父类型,必须对其进行初始化 在使用范围之外,以避免使用的构建时错误类型 在using语句中必须可以隐式转换为 System.IDisposable的
var order = new Order { Id = 1, OrderDate = DateTime.Now };
using (order as IDisposable)
{
...
}
这种使用方法很好。有没有办法明确Dispose?
答案 0 :(得分:1)
文档页面不正确(我提交了内部错误)。如果声明了虚方法,则只有在基类中覆盖相同的虚方法时才应调用base.Dispose。
要调用公开的Dispose方法,请使用((IDisposable)order).Dispose()
或Post.Cast<Order,IDisposable>(order).Dispose()
。第二个构造看起来很奇怪,但它在构建时验证。