2010-03-22 12 views

Répondre

18

Vous pouvez utiliser reflection pour cela.

Votre scénario pourrait ressembler un peu comme ceci:

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()); 
    } 

Si vous voulez recalculera les anniversaires de tous les mammifères. Et les Implémentations de ce qui précède sont à la recherche comme ceci:

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!"; 
    } 
} 

Alors basiquement ce que vous devez faire est d'utiliser relfection, qui est un mechanizm pour vérifier les types et obtenir les propriétés types et d'autres choses comme ça dans le temps d'exécution . Voici un exemple sur la façon dont vous ajoutez 10 jours à la date de naissance ci-dessus pour chaque mammifère qui a reçu une date de naissance. N'oubliez pas que l'utilisation de la réflexion peut être lente et lente en général.

Cependant, le ci-dessus affichera ceci:

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! 
+0

Wow, déjà marqué une réponse comme correcte. Mais votre aide a sauvé la journée - applaudissements – Chin

+0

Comment voulez-vous modifier cela pour utiliser un objet –

1

regarder en réflexion, mais vous ne basiquement ce

obj.GetType() GetProperties. (.. instance | ..Public) et vous avez une liste des propriétés définies .. vérifier le type de valeur de la propriété et comparez-le à typeof (DateTime).

11

Cela s'appelle Reflection.

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); 

    } 
} 
+0

Très apprécié. Regardera dans la réflexion. – Chin

3
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); 
    } 
} 
+1

+1 pour la solution linq – Axarydax

+0

Ohh je ne pensais pas à LINQ cette fois :) –

0

Pour des réponses très rapides et des pointeurs sur cette question, et si vous avez PowerShell disponible (Vista/Windows 7, Windows 2008 déjà obtenu installé), vous pouvez juste allumer la console et pour DateTime par exemple do

Get-Date | Get-Member 

Qui vous liste les membres d'une instance DateTime. Vous pouvez également consulter les membres statiques:

Get-Date | Get-Member -Static 
0

Si vous êtes préoccupé par l'impact de la performance de la réflexion que vous pourriez être intéressé par Fasterflect, une bibliothèque pour faire un accès et l'interrogation des membres plus facile et plus rapide.

Pour instace, le code de MaxGuernseyIII peut être réécrite en utilisant Fasterflect comme ceci:

var query = from property in typeof(HasDateTimes).Properties() 
      where property.Type() == typeof(DateTime) 
      select p; 
Array.ForEach(query.ToArray(), p => Console.WriteLine(p.Name)); 

Fasterflect utilise la génération de code léger pour rendre les accès plus rapidement (par un facteur de 2-5 fois, ou presque natif vitesses si vous mettez en cache et invoquez directement les délégués générés). La recherche de membres est généralement plus facile et plus pratique, mais pas plus rapide. Notez que ces nombres n'incluent pas le surcoût initial significatif de la compilation JIT du code généré, de sorte que les gains de performance ne deviennent visibles que pour les accès répétés.

Avis de non-responsabilité: Je suis un contributeur au projet.

0

Hey cette question est un peu plus, mais vous pouvez utiliser ceci:

dans la classe (sélectionner toutes les valeurs) - valeurs de réglage se lancer sans le casting `est juste pour la sélection:

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

en dehors de la classe serait:

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

Pour obtenir la valeur maximale Datetime je lance ce

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