Автосвойства C# 3.0. Можно ли добавить собственное поведение?

StackOverflow https://stackoverflow.com/questions/116142

Вопрос

Я хотел бы знать, есть ли какой-либо способ добавить собственное поведение к методам получения/установки автоматического свойства.

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

По сути, мне интересно, есть ли что-нибудь похожее на шаблон get/set или хук post get/set с областью действия класса.

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

Это было полезно?

Решение

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

Другие советы

Нет, ты не можешь :Свойство auto — это ярлык для явного доступа к частному полю.например

public string Name { get; set;} 

это ярлык для

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

Если вы хотите использовать собственную логику, вы должны явно написать get и set.

Смотреть на ПостШарп.Это платформа АОП для типичной проблемы «этот шаблон кода, который я использую сто раз в день, как я могу его автоматизировать?».Вы можете упростить это с помощью 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 );
}

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

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

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

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

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;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top