2015-12-16 1 views
0

Est-ce que quelqu'un a utilisé l'attribut PostSharp jetable? Il existe un exemple dans la documentation http://doc.postsharp.net/disposable#customize. La dernière section montre un moyen de personnaliser la logique de disposition (code de l'exemple ci-dessous), mais elle ne compile pas (en supposant que Formatter est System.Runtime.Serialization.Formatter). L'appel de base.Dispose les résultats dans une erreur de compilation 'objet' ne contient pas de définition pour 'Disposer'. Est-ce que je lis mal cet exemple? Quel est le moyen de personnaliser la méthode disposer?Attribut jetable PostSharp

[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; 
    } 
} 

Pour les classes où la logique n'est pas Éliminez sur mesure (plus de code de l'exemple ci-dessous), la méthode Dispose est pas disponible pour appeler (HomeMadeLogger.Dispose n'existe pas).

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

J'ai trouvé cet article qui décrit brièvement l'attribut Jetable: http://www.codeproject.com/Articles/774482/PostSharpin-Part. Il note que

... à utiliser votre type de parent dans une déclaration à l'aide, vous devez l'initialiser en dehors de la portée de l'utiliser pour éviter le type d'erreur accumulation du temps utilisé dans une déclaration à l'aide doit être implicitement convertible à System.IDisposable

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

Cette méthode d'utilisation fonctionne très bien. Y a-t-il un moyen de Disposer explicitement?

+0

Bien sûr, faites votre méthode Dispose() * public *. –

+0

Ce serait bien pour la logique personnalisée, mais l'exemple de la logique personnalisée ne compilera pas. La logique non personnalisée n'a pas de méthode Dispose dans votre classe, elle est gérée par l'attribut. – mslissap

Répondre

1

La page de documentation est incorrecte (j'ai déposé un bogue interne pour cela). Vous ne devez pas appeler base.Dispose si vous déclarez une méthode virtuelle, uniquement si vous remplacez la même méthode virtuelle dans la classe de base.

Pour appeler la méthode publique Dispose, utilisez ((IDisposable)order).Dispose() ou Post.Cast<Order,IDisposable>(order).Dispose(). La deuxième construction semble bizarre mais elle est validée au moment de la construction.

+0

Merci pour votre réponse! – mslissap