27 Stimmen

Wie finde ich alle Eigenschaften des Typs DateTime in einer Klasse?

Ich muss die Datumsangaben für eine Reihe von Objekten anpassen.

Ich möchte Schleife durch die Eigenschaften der Klasse und wenn der Typ ist dateTime entsprechend anpassen.

Gibt es irgendeine Art von "Typbeschreibung", die ich verwenden kann?

31voto

Filip Ekberg Punkte 35716

Sie können verwenden Reflexion für diese.

Ihr Szenario könnte in etwa so aussehen:

    static void Main(string[] args)
    {
        var list = new List<Mammal>();

        list.Add(new Person { Name = "Filip", DOB = DateTime.Now });
        list.Add(new Person { Name = "Peter", DOB = DateTime.Now });
        list.Add(new Person { Name = "Goran", DOB = DateTime.Now });
        list.Add(new Person { Name = "Markus", DOB = DateTime.Now });

        list.Add(new Dog { Name = "Sparky", Breed = "Unknown" });
        list.Add(new Dog { Name = "Little Kid", Breed = "Unknown" });
        list.Add(new Dog { Name = "Zorro", Breed = "Unknown" });

        foreach (var item in list)
            Console.WriteLine(item.Speek());

        list = ReCalculateDOB(list);

        foreach (var item in list)
            Console.WriteLine(item.Speek());
    }

Wenn Sie die Geburtstage aller Säugetiere neu berechnen wollen. Und die Implementierungen der oben genannten sehen wie folgt aus:

internal interface Mammal
{
    string Speek();
}

internal class Person : Mammal
{
    public string Name { get; set; }
    public DateTime DOB { get; set; }

    public string Speek()
    {
        return "My DOB is: " + DOB.ToString() ;
    }
}
internal class Dog : Mammal
{
    public string Name { get; set; }
    public string Breed { get; set; }

    public string Speek()
    {
        return "Woff!";
    }
}

Im Grunde genommen müssen Sie also Relfection verwenden, einen Mechanismus, um Typen zu überprüfen und die Eigenschaften der Typen und andere Dinge zur Laufzeit zu erhalten. Hier ist ein Beispiel, wie Sie 10 Tage zu den oben genannten DOB's für jedes Säugetier, das ein DOB bekam hinzufügen.

static List<Mammal> ReCalculateDOB(List<Mammal> list)
{
    foreach (var item in list)
    {
        var properties = item.GetType().GetProperties();
        foreach (var property in properties)
        {
            if (property.PropertyType == typeof(DateTime))
                property.SetValue(item, ((DateTime)property.GetValue(item, null)).AddDays(10), null);
        }
    }

    return list;
}

Denken Sie nur daran, dass die Verwendung von Reflexion langsam sein kann, und sie ist im Allgemeinen langsam.

Allerdings wird das Oben genannte gedruckt:

My DOB is: 2010-03-22 09:18:12
My DOB is: 2010-03-22 09:18:12
My DOB is: 2010-03-22 09:18:12
My DOB is: 2010-03-22 09:18:12
Woff!
Woff!
Woff!
My DOB is: 2010-04-01 09:18:12
My DOB is: 2010-04-01 09:18:12
My DOB is: 2010-04-01 09:18:12
My DOB is: 2010-04-01 09:18:12
Woff!
Woff!
Woff!

15voto

Axarydax Punkte 16025

Sie heißt "Reflexion".

var t = this;
var props = t.GetType().GetProperties();
foreach (var prop in props)
{
    if (prop.PropertyType == typeof(DateTime))
    {
        //do stuff like prop.SetValue(t, DateTime.Now, null);

    }
}

3voto

class HasDateTimes
{
  public DateTime Foo { get; set; }
  public string NotWanted { get; set; }
  public DateTime Bar { get { return DateTime.MinValue; } }
}

static void Main(string[] args)
{
  foreach (var propertyInfo in 
    from p in typeof(HasDateTimes).GetProperties()
      where Equals(p.PropertyType, typeof(DateTime)) select p)
  {
    Console.WriteLine(propertyInfo.Name);
  }
}

2voto

Bjego Punkte 635

Hey, diese Frage ist schon etwas älter, aber du könntest das hier gebrauchen:

innerhalb der Klasse (Auswahl aller Werte) - das Setzen von Werten würde ohne das Casting funktionieren, es ist nur zum Auswählen:

(from property in this.GetType().GetProperties()
                    where property.PropertyType == typeof(DateTime)
                    select property.GetValue(this)).Cast<DateTime>()

außerhalb der Klasse wäre:

var instance = new MyClass();
var times = (from property in instance.GetType().GetProperties()
                        where property.PropertyType == typeof(DateTime)
                        select property.GetValue(instance)).Cast<DateTime>()

Um den maximalen Datetime-Wert zu erhalten, führe ich Folgendes aus

var lastChange = (from property in this.GetType().GetProperties()
                        where property.PropertyType == typeof(DateTime)
                        select property.GetValue(this)).Cast<DateTime>().Max();

1voto

Peter Punkte 34999

Reflektion nachschlagen, aber im Grunde tun Sie Folgendes

obj.GetType().GetProperties(..Instance | ..Public) und Sie erhalten eine Liste der definierten Eigenschaften überprüfen Sie den Werttyp der Eigenschaft und vergleichen Sie ihn mit typeof(DateTime).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X