2008-09-22 4 views
6

Я хотел бы знать, есть ли способ добавить настраиваемое поведение к методам get/set автоматического свойства.C# 3.0 Авто-Свойства - Можно ли добавить пользовательское поведение?

Очевидным случаем, о котором я могу думать, является то, что каждый метод заданного свойства должен вызвать любые обработчики событий PropertyChanged как часть реализации System.ComponentModel.INotifyPropertyChanged. Это позволит классу иметь многочисленные свойства, которые можно наблюдать, где каждое свойство определяется с использованием синтаксиса автоматического свойства.

В принципе, мне интересно, есть ли что-либо похожее на шаблон get/set или post get/set hook с классом scope.

(я знаю, что та же конец функциональность может быть легко достигнута в чуть более многословными способами - я просто ненавижу дублирование узора)

ответ

17

Нет, вы должны будете использовать «традиционное» определение свойств для пользовательского поведения.

1

Если это поведение повторяется во время разработки, вы можете создать собственный фрагмент кода для вашего специального типа свойства.

4

Нет, вы не можете: auto property - это ярлык для явного доступа к частному полю. например

public string Name { get; set;} 

ярлык для

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

Если вы хотите поставить собственную логику вы должны написать получить и установить в явном виде.

1

Вы можете использовать PostSharp для написания перехватчиков сеттеров. Это LGPL и GPLed в зависимости от того, какие части библиотеки вы используете.

1

Ближайшим решение, которое я могу вспомнить, используя вспомогательный метод:

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

Посмотрите на PostSharp. Это система AOP для типичной проблемы «этот код кода, который я делаю время в день, как я могу его автоматизировать?». можно упростить с PostSharp этого (к примеру):

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

Но это не все! :)

 Смежные вопросы

  • Нет связанных вопросов^_^