Question

J'aimerais savoir s'il existe un moyen d'ajouter un comportement personnalisé aux méthodes auto / get de la propriété auto.

Un cas évident auquel je peux penser est de vouloir que chaque méthode set property appelle tous les gestionnaires d’événements PropertyChanged dans le cadre d’une implémentation System.ComponentModel.INotifyPropertyChanged . Cela permettrait à une classe d'avoir de nombreuses propriétés pouvant être observées, chaque propriété étant définie à l'aide de la syntaxe de propriété automatique.

En gros, je me demande s’il existe un objet similaire à un modèle get / set ou un hook post get / set avec une étendue de classe.

(Je sais que la même fonctionnalité finale peut facilement être obtenue de manières légèrement plus verbeuses - je déteste la duplication d'un motif)

Était-ce utile?

La solution

Non, vous devez utiliser "traditionnel". définitions de propriété pour un comportement personnalisé.

Autres conseils

Non, vous ne pouvez pas: la propriété auto est un raccourci pour un accesseur explicite à un champ privé. par exemple

public string Name { get; set;} 

est un raccourci vers

private string _name;
public string Name { get { return _name; } set { _name = value; } };

Si vous voulez définir une logique personnalisée, vous devez écrire get et définir explicitement.

Recherchez PostSharp . C’est un framework AOP pour un problème typique "ce modèle de code que je fais des centaines de fois par jour, comment puis-je l’automatiser?". Vous pouvez simplifier avec PostSharp ceci (par exemple):

public Class1 DoSomething( Class2 first, string text, decimal number ) {
    if ( null == first ) { throw new ArgumentNullException( "first" ); }
    if ( string.IsNullOrEmpty( text ) ) { throw new ArgumentException( "Must be not null and longer than 0.", "text" ) ; }
    if ( number < 15.7m || number > 76.57m ) { throw new OutOfRangeArgumentException( "Minimum is 15.7 and maximum 76.57.", "number"); }

    return new Class1( first.GetSomething( text ), number + text.Lenght );
}

à

    public Class1 DoSomething( [NotNull]Class2 first, [NotNullOrEmpty]string text, [InRange( 15.7, 76.57 )]decimal number ) {
        return new Class1( first.GetSomething( text ), number + text.Lenght );
}

Mais ce n’est pas tout! :)

S'il s'agit d'un comportement que vous allez répéter souvent au cours du développement, vous pouvez créer un extrait de code personnalisé pour votre type de propriété spécial.

Vous pouvez envisager d’utiliser PostSharp pour écrire des intercepteurs de setters. Il est à la fois LGPL et GPL selon les éléments de la bibliothèque que vous utilisez.

La solution la plus proche à laquelle je peux penser utilise une méthode d'assistance:

public void SetProperty<T>(string propertyName, ref T field, T value)
 { field = value;
   NotifyPropertyChanged(propertyName);
 }

public Foo MyProperty 
 { get { return _myProperty}
   set { SetProperty("MyProperty",ref _myProperty, value);}
 } Foo _myProperty;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top