仅设置setter属性

时间:2013-02-11 14:08:00

标签: c#

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

public class SomeModel
{
   public string SomeString { get; set; }

   public void DoSomeWork()
   {
      ....
   }
}

我想在DoSomeWork属性更改后自动执行SomeString函数。我尝试了这个,但它不起作用:

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

正确的语法是什么?

5 个答案:

答案 0 :(得分:12)

使用私有字段,就像这样...

public class SomeModel
{
    private string someString = "";

    public string SomeString {
        get { return this.someString; }
        set {
            this.someString = value;
            this.DoSomeWork();
        }
    }

   public void DoSomeWork()
   {
      ....
   }
}

答案 1 :(得分:3)

您无法使用自动属性执行此操作 - 您必须创建由字段支持的“手动”属性。

private string _someString;

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

如果确实无法处理此样板(假设您必须执行此操作数百次),请考虑使用像PostSharp这样的AOP框架来实现此功能代表 - 你只需要声明一个自动属性和一个属性来获取二进制重写器来实现所需的方案。

答案 2 :(得分:2)

这会有用......

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

答案 3 :(得分:1)

private string _someString;

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

答案 4 :(得分:0)

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.
     }
}