Domanda

Vorrei sapere se esiste un modo per aggiungere un comportamento personalizzato ai metodi get / set della proprietà automatica.

Un caso ovvio a cui riesco a pensare è che ogni metodo di proprietà impostato venga richiamato da qualsiasi gestore di eventi PropertyChanged come parte di un'implementazione System.ComponentModel.INotifyPropertyChanged . Ciò consentirebbe a una classe di avere numerose proprietà che possono essere osservate, dove ogni proprietà è definita usando la sintassi automatica delle proprietà.

Fondamentalmente mi chiedo se c'è qualcosa di simile a un modello get / set o al gancio post get / set con ambito di classe.

(So che la stessa funzionalità finale può essere facilmente raggiunta in modi leggermente più dettagliati - odio solo la duplicazione di un modello)

È stato utile?

Soluzione

No, dovrai utilizzare " tradizionale " definizioni di proprietà per comportamento personalizzato.

Altri suggerimenti

No, non puoi: la proprietà automatica è una scorciatoia per un programma di accesso esplicito a un campo privato. per es.

public string Name { get; set;} 

è una scorciatoia per

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

Se si desidera inserire una logica personalizzata, è necessario scrivere get e impostarlo in modo esplicito.

Guarda PostSharp . È un framework AOP per l'emissione tipica "questo modello di codice che faccio hunderd volta al giorno, come posso automatizzarlo?" È possibile semplificare con PostSharp questo (ad esempio):

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

a

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

Ma questo non è tutto! :)

Se si tratta di un comportamento che ripeterai molto durante lo sviluppo, puoi creare uno snippet di codice personalizzato per il tuo tipo speciale di proprietà.

Puoi prendere in considerazione l'utilizzo di PostSharp per scrivere intercettori di setter. È sia LGPL che GPL a seconda dei pezzi della libreria che usi.

La soluzione più vicina a cui riesco a pensare è l'utilizzo di un metodo di supporto:

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;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top