2013-02-11 21 views
5

mam model obiektu, który ma właściwość takiego:Ustawienie tylko właściwość setter

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

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

chcę funkcja DoSomeWork wykonać automatycznie po SomeString zmian własności. Próbowałem, ale to nie działa:

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

Jaka jest prawidłowa składnia?

+0

co dokładnie oznacza "nie działa"? – Yahia

Odpowiedz

12

Użyj prywatną pole zamiast, jak to ...

public class SomeModel 
{ 
    private string someString = ""; 

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

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

Nie można tego zrobić z właściwości automatycznych - musisz utworzyć „ręcznego” własność poparte polu.

private string _someString; 

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

Jeśli naprawdę nie może poradzić sobie z tym boilerplate (powiedzmy, że trzeba zrobić to setki razy), należy rozważyć użycie ram AOP jak PostSharp zaimplementować to w Twoim imieniu - Można by wystarczy zadeklarować właściwość automatyczną i atrybut, aby uzyskać program do zapisu binarnego w celu zaimplementowania pożądanego schematu.

2

Będzie to działać ...

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# zespół wprowadził właściwości auto-zaimplementować w C# 3.0. z logiką minimalizacji tworzenia modelu, która jest wspierana przez anonimowe pole utworzone przez kompilator. ten jest używany, gdy nie musisz implementować żadnej dodatkowej logiki dla właściwości klasy obiektu. więc po prostu podążał za.

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

jeśli chcemy dodać trochę logiki, aby dodać jedną funkcję. musimy napisać własność ręczną wspieraną przez prywatne pole, tak jak poniżej.

private string _Name; 
public string Name 
{ 
    get {return _Name;} 
set { 
     _Name=value; 
     DoSomething(); //Additional logic implemented. 
    } 
} 
Powiązane problemy