2017-02-14 1 views
3

Ich habe folgende vereinfachte Klasse:C#, wie Klassenvariable Referenz ein anderer Wert innerhalb der Klasse machen

public class Foo 
{ 
    public DateTime dateOfBirth {get; set;} 
    public Age age {get; set;} 
} 

und Age ist wie folgt:

Public class Age 
{ 
    public DateTime dateOfBirth {get; set;}  
    //..Calculate age here 
} 

Jetzt will ich Foo.Age.dateOfBirthFoo.dateOfBirth gleichen automatisch zB wenn ein Benutzer folgendes tut:

var Foo foo = new Foo(); 
foo.dateOfBirth = //..whatever 

Hinweis: Dies kann nicht im Konstruktor sein, da der Benutzer den Dob nicht im Konstruktor festlegen kann, und dies würde auch nicht die Situation abdecken, in der sich der Dob ändert.

Es muss eine direkte Referenz auf die Variable dateOfBirth sein.

Kann sein getan werden?

+0

Interessant. Wenn "Alter" öffentlich ist, warum möchtest du dann eine zweite "dateOfBirth" haben, die gleich "age.dateOfBirth" ist? Sie möchten keine langen Variablennamen eingeben? – JHBonarius

+0

@ J.H.Bonarius ist es nur zu Illustrationszwecken. Das Geburtsdatum wird in einer anderen Variablen innerhalb der Klasse gespeichert, und ich werde dies verwenden, um das Geburtsdatum zu setzen und das Alter der Person in der Altersklasse zu berechnen – Alex

Antwort

3

Sie die Setter verwenden könnte machen die DateOfBirth Eigenschaft hängen von der Age Eigenschaft wäre es einfacher war, konnte man den C#6 Ausdruck bodied Nur-Lese-Eigenschaft:

public class Foo 
{ 
    public DateTime DateOfBirth => Age?.DateOfBirth ?? DateTime.MinValue; 
    public Age Age { get; set; } 
} 
Ja
+2

nice C# 6 Beispiel – JHBonarius

+1

Diese Lösung (die längere) erlaubt zu setzen 'Age.DateOfBirth' und unterbricht somit die Konsistenz. Ich mag jedoch den kurzen. – wkl

+0

@ wkl: guter Punkt. –

3

Sie sollten den Setter in Foo mit dem Setter in Age verknüpfen. Try this:

public class Foo 
{ 
public DateTime dateOfBirth { 
    get { return Age.dateOfBirth; } 
    set { Age.dateOfBirth = value; } 
} 
public Age age {get; set;} 

public Foo() { Age = new Age(); } 
} 
3

Implementieren Getter und Setter von dateOfBirth die Age Eigenschaft zu verwenden. Im Gegensatz zu den meisten anderen Antworten wird dieses sicherstellen, dass diese Eigenschaft ist immer != null und die beiden DateOfBirth Eigenschaften sind immer konsistent:

public class Foo 
{ 
    private DateTime _dateOfBirth; 

    public DateTime DateOfBirth 
    { 
     get { return _dateOfBirth; } 
     set { 
      _dateOfBirth = value; 
      if(Age != null) 
       Age.DateOfBirth = value; 
     } 
    } 

    public Age Age { get; set; } 
} 

Wenn Sie:

public class Foo 
{ 
    public DateTime dateOfBirth 
    { 
     get{ return Age.dateOfBirth; } 
     set{ Age.dateOfBirth = value; } 
    } 

    private readonly Age _age = new Age(); 
    public Age Age { get{ return _age; } } 
} 
2

, sollte es möglich sein, indem Sie den folgenden Code verwenden,

public class Foo 
{ 
    private DateTime _dateOfBirth; 

     public DateTime dateOfBirth 
     { 
     get 
     { 
      return _dateOfBirth; 
     } 
     set 
     { 
      _dateOfBirth = value; 
      this.Age.dateOfBirth = value; 
     } 
    } 
    public Age age {get; set;} 
} 
+1

Diese Lösung erlaubt es, 'Age.DateOfBirth' zu setzen und somit die Konsistenz zu brechen. – wkl

Verwandte Themen