C#中是否有一种方法可以让setter继承“something”,这样每次为特定的基类调用setter时它都会运行一些代码并且它是继承者?
我想要做的是在我的基类上有一个名为IsValid的布尔标志。验证对象后,我将此布尔值设置为true,然后如果在验证后调用任何setter,我希望setter将IsValid标志更改为false。
我不想将这个逻辑写入每个setter。
答案 0 :(得分:3)
不,这种语言不能直接使用。
但是,处理此问题的一种方法是使用INotifyPropertyChanged之类的内容。如果基类指定它实现此接口,则子类也应该引发PropertyChanged事件。基类可以使用它来跟踪更改并验证对象。
答案 1 :(得分:2)
你基本上要求某个版本的Aspect Oriented Programming(AOP)。您有一个要在所有属性中执行的常见操作,而不是在每种情况下都执行它。
我不确定C#中AOP的选择究竟是什么,但我之前使用的是Spring.Net AOP。它将做的是将您的类包装在动态创建的包装器中,该包装器将拦截对您的属性的所有调用,然后允许您实现一些常见的逻辑来执行。
答案 2 :(得分:2)
查看PostSharp以在StructureMap中添加此功能或者此线程 http://groups.google.com/group/structuremap-users/browse_thread/thread/fbadf4c2779ab8ed?hl=en
答案 3 :(得分:0)
如果有问题的属性是虚拟的,您可以覆盖它们以提供通知并调用基类的实现以确保“设置”通过。
答案 4 :(得分:0)
在每个setter中没有代码的情况下,在C#中执行此操作的唯一方法是通过TransparentProxy。它有点麻烦,但它可以让编码器看不见。
答案 5 :(得分:0)
那么,你可以做的是在抽象类中创建一个虚方法,并从属性setter中调用它。然后你可以在继承的类中覆盖它。
答案 6 :(得分:0)
我一直遇到这个问题...所以我使用这样的模式:
public class Foo
{
public string Bar1
{
get{return this._Bar1;}
set{this.SafeSet(ref this._Bar1, value);}
}public string _Bar1;
public int Bar2
{
get{return this._Bar2;}
set{this.SafeSet(ref this._Bar2, value);}
}public int _Bar2;
protected virtual SafeSet<T> (ref T local, T val)
{
if(local != val)
{
local = val;
//whatever other post-processing you want
}
}
}