Pregunta

Me gustaría saber si hay alguna forma de agregar un comportamiento personalizado a los métodos de obtención/establecimiento de propiedades automáticas.

Un caso obvio que se me ocurre es querer que cada método de propiedad establecido llame a cualquier PropertyChanged controladores de eventos como parte de un System.ComponentModel.INotifyPropertyChanged implementación.Esto permitiría que una clase tenga numerosas propiedades que se pueden observar, donde cada propiedad se define utilizando la sintaxis de propiedad automática.

Básicamente, me pregunto si hay algo similar a una plantilla get/set o a un gancho post get/set con alcance de clase.

(Sé que la misma funcionalidad final se puede lograr fácilmente de formas un poco más detalladas; simplemente odio la duplicación de un patrón)

¿Fue útil?

Solución

No, tendrá que utilizar definiciones de propiedades "tradicionales" para un comportamiento personalizado.

Otros consejos

No, no puedes :La propiedad automática es un atajo para un descriptor de acceso explícito a un campo privado.p.ej.

public string Name { get; set;} 

es un atajo para

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

Si desea poner una lógica personalizada, debe escribir get y set explícitamente.

Mirar hacia PostSharp.Es un marco AOP para el problema típico "este patrón de código lo hago cientos de veces al día, ¿cómo puedo automatizarlo?".Puedes simplificar con PostSharp esto (por ejemplo):

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

¡Pero esto no es todo!:)

Si es un comportamiento que repetirá mucho durante el desarrollo, puede crear un fragmento de código personalizado para su tipo especial de propiedad.

Podrías considerar usar PostSharp escribir interceptores de establecedores.Es tanto LGPL como GPL dependiendo de qué partes de la biblioteca utilice.

La solución más cercana que se me ocurre es utilizar un método auxiliar:

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;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top