2008-09-22 16 views
6

Je voudrais savoir s'il est possible d'ajouter un comportement personnalisé aux méthodes get/set de la propriété auto.C# 3.0 Auto-Propriétés - Est-il possible d'ajouter un comportement personnalisé?

Un cas évident auquel je peux penser est de vouloir que chaque méthode de propriété set appelle des 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, où chaque propriété est définie à l'aide de la syntaxe de propriété automatique. Fondamentalement, je me demande s'il y a quelque chose de similaire à un modèle get/set ou un hook post get/set avec une portée de classe.

(je sais la même fonctionnalité final peut facilement être réalisé de manière un peu plus verbeux - Je déteste la duplication d'un motif)

Répondre

17

Non, vous devez utiliser les définitions de propriétés « traditionnelles » pour un comportement personnalisé.

1

S'il s'agit d'un comportement que vous répéterez souvent lors du développement, vous pouvez créer un extrait de code personnalisé pour votre type de propriété particulier.

4

Non, vous ne pouvez pas: la propriété auto est un raccourci pour un accès 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 mettre une logique personnalisée, vous devez écrire obtenir et définir explicitement.

1

Vous pouvez utiliser PostSharp pour écrire des intercepteurs de setters. Il est à la fois LGPL et GPLed selon les pièces de la bibliothèque que vous utilisez.

1

La solution la plus proche, 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; 
2

Regardez à PostSharp. Il s'agit d'un cadre AOP pour un problème typique: "Je fais ce code un peu plus d'un jour, comment puis-je l'automatiser?". Vous pouvez simplifiez 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! :)