仅设置setter属性

本文关键字:属性 setter 设置 | 更新日期: 2023-09-27 17:58:51

我有一个对象模型,它的属性如下:

public class SomeModel
{
   public string SomeString { get; set; }
   public void DoSomeWork()
   {
      ....
   }
}

我希望DoSomeWork函数在SomeString属性更改后自动执行。我试过了,但不起作用:

public string SomeString { get; set { DoSomeWork(); } }

正确的语法是什么?

仅设置setter属性

使用私有字段,如下所示。。。

public class SomeModel
{
    private string someString = "";
    public string SomeString {
        get { return this.someString; }
        set {
            this.someString = value;
            this.DoSomeWork();
        }
    }
   public void DoSomeWork()
   {
      ....
   }
}

您不能用自动属性来实现这一点,您必须创建一个由字段支持的"手动"属性。

private string _someString;
public string SomeString
{ 
   get { return _someString; }
   set 
   {
        _someString = value;
        DoSomeWork();
   }
}

如果真的无法处理这个样板(比如说你必须这样做数百次),可以考虑使用PostSharp这样的AOP框架来代表你实现这一点——你只需要声明一个自动属性和一个属性,就可以让二进制重写器实现所需的方案。

这将起作用。。。

private string _someString;
public string SomeString { get { return _someString; } set { _someString = value; DoSomeWork(); } }
private string _someString;
public string SomeString
{
    get
    {
       return _someString;
    }
    set 
    {
       DoSomeWork();
       _someString = value;
    }
}

C#团队在C#3.0中引入了自动实现属性。通过编译器创建的匿名字段来支持最小化模型生成的逻辑。当您不需要在对象类的属性上实现任何额外的逻辑时,就会使用这个。所以它只是按照.

public string Name{ get; set;}// auto-implemented property. no additional logic.

如果我们想添加一些逻辑,就像你想添加一个函数一样。我们必须编写一个由私人字段支持的手动属性,如下所示。

private string _Name;
public string Name
{
  get {return _Name;}
 set {
        _Name=value;
        DoSomething(); //Additional logic implemented.
     }
}