C#Custom Setter事件或继承的Setter

时间:2009-12-04 19:14:56

标签: c#

C#中是否有一种方法可以让setter继承“something”,这样每次为特定的基类调用setter时它都会运行一些代码并且它是继承者?

我想要做的是在我的基类上有一个名为IsValid的布尔标志。验证对象后,我将此布尔值设置为true,然后如果在验证后调用任何setter,我希望setter将IsValid标志更改为false。

我不想将这个逻辑写入每个setter。

7 个答案:

答案 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
      }
   }
}