C # 3.0 Auto-Eigenschaften - Ist es möglich, individuelle Verhalten hinzufügen?
-
02-07-2019 - |
Frage
Ich möchte wissen, ob es eine Möglichkeit gibt, individuelle Verhalten auf die Eigenschaft auto get / set-Methoden.
hinzufügen Ein offensichtlicher Fall, dass ich denken kann, ist jeder Satz Eigenschaft Methode aufrufen, auf irgendwelchen PropertyChanged
Event-Handler als Teil einer System.ComponentModel.INotifyPropertyChanged
Implementierung zu wollen. Dies würde eine Klasse ermöglicht zahlreiche Eigenschaften, die beobachtet werden können, wobei jede Eigenschaft definiert ist Eigenschaft auto-Syntax.
Im Grunde frage ich mich, ob es etwas ist ähnlich entweder eine get / set-Vorlage oder Post erhalten / set Haken mit Klassenbereich.
(Ich weiß, die gleiche End-Funktionalität leicht in etwas ausführlichen Art und Weise erreicht werden kann - ich nur Duplikation eines Musters hasst)
Lösung
Nein, Sie haben „traditionelle“ Eigenschaftsdefinitionen für benutzerdefiniertes Verhalten verwenden.
Andere Tipps
Nein, Sie können nicht: auto Eigenschaft eine Abkürzung für eine explizite Zugriffs zu einem privaten Bereich ist. z.
public string Name { get; set;}
ist eine Verknüpfung mit
private string _name;
public string Name { get { return _name; } set { _name = value; } };
Wenn Sie benutzerdefinierte Logik setzen, müssen Sie schreiben explizit erhalten und eingestellt werden.
Schauen Sie auf Postsharp . Es ist ein AOP Framework für typicaly Problem „dieses Codemuster ich einen Tag hunderd Zeit zu tun, wie ich es automatisieren können?“. Sie können mit Postsharp vereinfachen dieses (zum Beispiel):
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 );
}
Aber das ist nicht alles! :)
Wenn es ein Verhalten, das Sie viel während der Entwicklung wiederholen werden, können Sie einen benutzerdefinierten Code-Snippet für Ihre spezielle Art der Immobilie erstellen.
Sie könnten prüfen, mit Postsharp Abfangjäger des Setter zu schreiben. Es ist sowohl LGPL und GPL-lizenzierten je nachdem, welche Teile der Bibliothek, die Sie verwenden.
Die nächste Lösung, die ich denken kann, wird mit einer Hilfsmethode:
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;