2013-07-19 27 views
8

Say I stworzył typ anonimowy dla osoby, która ma nazwę i datę urodzenia jako właściwości:Dostęp do właściwości anonimowych typów w języku C#?

var person = new{ Name = "Mike", BirthDate = new DateTime(1990, 9, 2) }; 

następnie później, postanowił dodać metodę, która będzie zwracać wiek danej osoby.

var person = new { Name = "Mike", 
        BirthDate = new DateTime(1990, 9, 2), 
        GetAge = new Func<int>(() => { return /* What? */; }) }; 

Jak uzyskać dostęp do właściwości BirthDate tak, że mogę obliczyć wiek? Próbowałem używać this, ale oczywiście to nie zadziałało.

+1

Ponieważ Właściwości typu anonimowe są tylko do odczytu widzę sensu robiąc to. Możesz po prostu użyć 'new DateTime (1990, 9, 2)' bezpośrednio w implementacji 'GetAge' i nie będzie różnicy. – MarcinJuraszek

+6

Nie możesz, o ile wiem. –

+0

@MarcinJuraszek Nie wiem kiedy i dlaczego, ale gdybym przedstawił sytuację w przyszłości, gdzie muszę to zrobić, co zrobię? – dpp

Odpowiedz

4

Nie możesz. Trzeba będzie utworzyć klasę Person mieć taką funkcjonalność:

class Person { 
     public string Name { get; set; } 
     public DateTime BirthDate { get; set; } 
     public TimeSpan Age { 
      get { 
       // calculate Age 
      } 
     } 
    } 

    var person = new Person { 
      Name = "Mike", 
      BirthDate = new DateTime(1990, 9, 2)) 
    }; 

Edit: Inną opcją jest stworzenie extension method dla DateTime:

public static TimeSpan GetAge(this DateTime date) { 
     // calculate Age 
    } 

    var person = new { 
      Name = "Mike", 
      BirthDate = new DateTime(1990, 9, 2)) 
    }; 

    TimeSpan age = person.BirthDate.GetAge(); 
+0

+1 To jest solidna odpowiedź ... – MoonKnight

+1

Nie potrzebuję samouczka, jak zadeklarować klasę i właściwości, studiuję typy anonimowe i obiekty dynamiczne. Niemniej jednak doceniam pomoc każdego. – dpp

+0

+1 dla metody rozszerzenia. Mimo to doda również metodę "GetAge" do innych obiektów 'DateTime'. – dpp