2016-05-27 19 views
0

Ist es möglich, eine Methode in einer Basisklasse zu haben, um Eigenschaften einer abgeleiteten Klasse zu ändern? Ich war so etwas wie dieses Denken:Ändern von abgeleiteten Klassenwerten aus der Basisklasse

public class baseclass 
{ 
    public void changeProperties(string propertyName, string newValue) 
    { 
    try 
    { 
     this.propertyName = newValue; 
    } 
    catch 
    { 
     throw new NullReferenceException("Property doesn't exist!"); 
    } 
    } 
} 
+2

Scheint ein Code-Geruch für mich. Ich würde eine virtuelle Methode in der Basisklasse bevorzugen, um die Änderung vorzunehmen. Es könnte in der Basisklasse leer sein und in abgeleiteten Klassen, die es benötigen, überladen sein. –

+0

Wenn Sie etwas wie "INotifyPropertyChanged" Implementierung tun, ist dies ziemlich üblich. Anstelle von propertyName übergeben Sie die Eigenschaft als Referenz an die Methode. Obwohl Sie es auf den zweiten Blick versuchen, versuchen Sie tatsächlich, den Namen der Eigenschaft neu zu schreiben. Das können/wollen Sie nicht tun. – Jonesopolis

Antwort

0

Sie können Ihr Problem durch Reflexion lösen, weil this Referenz des Typs gleich tatsächlichen Typ, dh Art der abgeleiteten Klasse sein wird:

Solution:

public class baseclass 
{ 
    public void changeProperties(string propertyName, object newValue) 
    {    
     var prop = GetType().GetProperty(propertyName); 
     if (prop == null) 
      throw new NullReferenceException("Property doesn't exist!"); 
     else 
      prop.SetValue(this, newValue); 
    } 
} 

Implementierung:

public class Test : baseclass 
{ 
    public int Age { get; set; } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var test = new Test(); 
     test.changeProperties("Age", 2); 
    } 
}