我想知道是否有任何方法可以为auto属性get / set方法添加自定义行为。
我能想到的一个明显的例子是希望每个set属性方法作为PropertyChanged
实现的一部分调用任何System.ComponentModel.INotifyPropertyChanged
事件处理程序。这将允许类具有可以观察到的众多属性,其中每个属性都使用自动属性语法定义。
基本上我想知道是否有任何类似于get / set模板或者使用类范围发布get / set钩子。
(我知道可以通过稍微冗长的方式轻松实现相同的最终功能 - 我只是讨厌重复模式)
答案 0 :(得分:17)
不,您必须对自定义行为使用“传统”属性定义。
答案 1 :(得分:4)
否则不能:auto属性是私有字段的显式访问者的快捷方式。 e.g。
public string Name { get; set;}
是
的捷径private string _name;
public string Name { get { return _name; } set { _name = value; } };
如果要放置自定义逻辑,则必须明确写入get和set。
答案 2 :(得分: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 );
}
但这不是全部! :)
答案 3 :(得分:1)
如果这是一种在开发过程中会重复的行为,您可以为特殊类型的属性创建自定义代码段。
答案 4 :(得分:1)
您可以考虑使用PostSharp来编写setter的拦截器。 LGPL和GPL都取决于您使用的库的哪些部分。
答案 5 :(得分: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;