2013-02-11 180 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. 
    } 
}