2008-09-22 40 views
6

我想知道是否有任何方法将自定义行为添加到自动属性get/set方法。C#3.0自动属性 ​​- 是否可以添加自定义行为?

我能想到的一个明显情况是希望每个设置属性方法都可以调用任何PropertyChanged事件处理程序,作为System.ComponentModel.INotifyPropertyChanged实现的一部分。这将允许一个类有许多可以观察到的属性,其中每个属性都是使用自动属性语法定义的。

基本上我想知道是否有任何类似的get/set模板或类后范围后获取/设置钩。

(我知道的同一端的功能可以很容易地在稍微详细的方式来实现 - 我只是讨厌的模式重复)

回答

17

不,你必须使用自定义的行为“传统”的定义的属性。

1

如果这是一种在开发过程中会重复的行为,您可以为您的特殊类型的属性创建自定义代码段。

4

不,您不能:自动属性是显式访问者到私人字段的快捷方式。例如

public string Name { get; set;} 

是一个捷径

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

如果你想要把自定义的逻辑,你必须编写,并得到明确设置。

1

你可以考虑使用PostSharp编写setter的拦截器。这是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); 
} 

但是,这还不是全部! :)

相关问题