5

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

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

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

我希望该功能在属性更改DoSomeWork后自动执行。SomeString我试过这个,但它不工作:

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

什么是正确的语法?

4

5 回答 5

12

改用私有字段,像这样......

public class SomeModel
{
    private string someString = "";

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

   public void DoSomeWork()
   {
      ....
   }
}
于 2013-02-11T14:10:59.320 回答
3

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

private string _someString;

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

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

于 2013-02-11T14:11:19.493 回答
2

这将工作...

private string _someString;
public string SomeString { get { return _someString; } set { _someString = value; DoSomeWork(); } }
于 2013-02-11T14:11:32.990 回答
1
private string _someString;

public string SomeString
{
    get
    {
       return _someString;
    }
    set 
    {
       DoSomeWork();
       _someString = value;
    }
}
于 2013-02-11T14:12:09.060 回答
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.
     }
}
于 2013-02-11T14:40:28.810 回答