2013-02-11 87 views
5

我有了这样一个属性的对象模型:设置只有setter属性

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

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

我想DoSomeWork功能的SomeString属性更改后自动执行。我试过这个,但它不起作用:

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

什么是正确的语法?

+0

究竟是什么意思是“它不工作”? – Yahia 2013-02-11 14:10:06

回答

12

使用的私人领域,而不是像这样......

public class SomeModel 
{ 
    private string someString = ""; 

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

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

你不能用自动属性做到这一点 - 你必须创建一个“手动”属性由现场支持。

private string _someString; 

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

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

2

这将工作...

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

public string SomeString 
{ 
    get 
    { 
     return _someString; 
    } 
    set 
    { 
     DoSomeWork(); 
     _someString = value; 
    } 
} 
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. 
    } 
}