2013-02-11 15 views
5

Ho un modello di oggetto che ha una proprietà come questa:impostazione solo una proprietà setter

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

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

Voglio la funzione DoSomeWork per eseguire automaticamente dopo le SomeString modifiche alle proprietà. Ho provato questo, ma non funziona:

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

Qual è la sintassi corretta?

+0

cosa significa esattamente "non funziona"? – Yahia

risposta

12

Utilizzare un campo privato, invece, come questo ...

public class SomeModel 
{ 
    private string someString = ""; 

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

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

Non si può fare questo con le proprietà automatiche - si dovrà creare una proprietà "manuale", sostenuto da un campo.

private string _someString; 

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

Se davvero non può trattare con questo testo standard (dire che avrei dovuto fare questo centinaia di volte), considerare l'utilizzo di un framework AOP come PostSharp per implementare questo a vostro nome - si aveva basta dichiarare una proprietà automatica e un attributo per ottenere che il rewriter binario implementa lo schema desiderato.

2

Ciò funzionerà ...

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# team ha introdotto le proprietà auto-implementazione in C# 3.0. con la logica di minimizzare la creazione del modello che è supportata da un campo anonimo creato dal compilatore. questo viene utilizzato quando non è necessario implementare alcuna logica aggiuntiva su una proprietà di una classe di oggetti. quindi è appena seguito come

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

se vogliamo aggiungere qualche logica in quanto si desidera aggiungere una funzione. dobbiamo scrivere una proprietà manuale supportata da un campo privato come di seguito.

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