2008-09-22 27 views
6

Me gustaría saber si hay alguna forma de agregar un comportamiento personalizado a los métodos get/set de propiedades automáticas.C# 3.0 Propiedades automáticas: ¿es posible agregar un comportamiento personalizado?

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

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

(sé la misma funcionalidad final se puede conseguir fácilmente en formas ligeramente más detallados - yo que odio la duplicación de un patrón)

Respuesta

17

No, usted tendrá que usar las definiciones de propiedad "tradicionales" para el comportamiento personalizado.

1

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

4

No, no se puede: propiedad automática son un acceso directo para un acceso directo a un campo privado. p.ej.

public string Name { get; set;} 

es un acceso directo a

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

Si usted quiere poner una lógica personalizada debe escribir obtener y establecer de forma explícita.

1

Podría considerar el uso de PostSharp para escribir interceptores de setters. Es tanto LGPL como GPL dependiendo de qué partes de la biblioteca use.

1

La solución más cercano que puedo pensar en está utilizando un método de ayuda:

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

mirada a PostSharp. Es un marco de trabajo de AOP para el problema típico "este patrón de código lo hago a tiempo completo al día, ¿cómo puedo automatizarlo?". puede 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! :)

Cuestiones relacionadas