6
votes

Supprimer la multidiffusion postSharp avec attribut

J'ai récemment commencé à expérimenter PostSharp et j'ai trouvé un aspect particulièrement utile pour automatiser la mise en œuvre de InotiplexPropertychanged. Vous pouvez voir l'exemple ici . La fonctionnalité de base est excellente (toutes les propriétés seront notifiées), mais il y aura des cas où je pourrais vouloir supprimer la notification.

Par exemple, je sais peut-être qu'une propriété particulière est définie une fois dans le constructeur et ne changera plus jamais. En tant que tel, il n'est pas nécessaire d'émettre le code pour notifypropertychangned. Les frais généraux sont minimes lorsque les classes ne sont pas fréquemment instanciées et je peux empêcher le problème en passant à partir d'une propriété générée automatiquement à une propriété accompagnée de champ et à une écriture sur le terrain. Cependant, comme j'apprends ce nouvel outil, il serait utile de savoir s'il existe un moyen de marquer une propriété avec un attribut pour supprimer la génération de code. J'aimerais pouvoir faire quelque chose comme ceci: xxx


0 commentaires

3 Réponses :


5
votes

Vous pouvez utiliser une méthodeTOPTOPTUTCUT à la place d'un fichier multicastpoint, c'est-à-dire d'utiliser Linq-Over-réflexion et filtrant contre PropertyInfo.isdefinefin (votre attribut).

  private IEnumerable<PropertyInfo> SelectProperties( Type type )
    {
        const BindingFlags bindingFlags = BindingFlags.Instance | 
            BindingFlags.DeclaredOnly
                                          | BindingFlags.Public;

        return from property
                   in type.GetProperties( bindingFlags )
               where property.CanWrite &&
                     !property.IsDefined(typeof(SuppressNotify))
               select property;
    }

    [OnLocationSetValueAdvice, MethodPointcut( "SelectProperties" )]
    public void OnSetValue( LocationInterceptionArgs args )
    {
        if ( args.Value != args.GetCurrentValue() )
        {
            args.ProceedSetValue();

           this.OnPropertyChangedMethod.Invoke(null);
        }
    }


1 commentaires

Excellent merci. Ceci est un outil très puissant et mon projet se sent très propre sans toute la plomberie inotifortychangée inotiplique fastidieuse.



0
votes

FYI, j'ai eu des problèmes avec l'exemple sur le site Web SharpCrafters et devaient faire le changement suivant:

    /// <summary>
    /// Field bound at runtime to a delegate of the method <c>OnPropertyChanged</c>.
    /// </summary>
    [ImportMember("OnPropertyChanged", IsRequired = true, Order = ImportMemberOrder.AfterIntroductions)]
    public Action<string> OnPropertyChangedMethod;


0 commentaires

3
votes

Une autre méthode facile, utilisez: xxx pré>

... pour supprimer les attributs d'une méthode particulière. Cela fonctionne même s'il y a un attribut global attaché à la classe (comme dans l'exemple ci-dessus). P>

Voici le code d'exemple complet: P>

[NotifyPropertyChanged]
public class MyClass
{
    public double SomeValue { get; set; }

    public double ModifiedValue { get; private set; }

    [NotifyPropertyChanged(AttributeExclude=True)]
    public double OnlySetOnce { get; private set; }

    public MyClass()
    {
        OnlySetOnce = 1.0;
    }
}


0 commentaires