2009-01-08 6 views
2

Je les classes suivantes:Comment faire pour diff Valeurs de propriété de deux objets en utilisant GetType GetValue?

public class Person 
{ 
    public String FirstName { set; get; } 
    public String LastName { set; get; } 
    public Role Role { set; get; } 
} 

public class Role 
{ 
    public String Description { set; get; } 
    public Double Salary { set; get; } 
    public Boolean HasBonus { set; get; } 
} 

Je veux être en mesure d'extraire automatiquement la valeur de la propriété diférences entre Person1 et Person2, par exemple comme ci-dessous:

public static List<String> DiffObjectsProperties(T a, T b) 
{ 
    List<String> differences = new List<String>(); 
    foreach (var p in a.GetType().GetProperties()) 
    { 
     var v1 = p.GetValue(a, null); 
     var v2 = b.GetType().GetProperty(p.Name).GetValue(b, null); 

     /* What happens if property type is a class e.g. Role??? 
     * How do we extract property values of Role? 
     * Need to come up a better way than using .Namespace != "System" 
     */ 
     if (!v1.GetType() 
      .Namespace 
      .Equals("System", StringComparison.OrdinalIgnoreCase)) 
      continue; 

     //add values to differences List 
    } 

    return differences; 
} 

Comment puis-je extraire des valeurs de propriété de Rôle dans la personne ???

Répondre

2
public static List<String> DiffObjectsProperties(object a, object b) 
{ 
    Type type = a.GetType(); 
    List<String> differences = new List<String>(); 
    foreach (PropertyInfo p in type.GetProperties()) 
    { 
     object aValue = p.GetValue(a, null); 
     object bValue = p.GetValue(b, null); 

     if (p.PropertyType.IsPrimitive || p.PropertyType == typeof(string)) 
     { 
      if (!aValue.Equals(bValue)) 
       differences.Add(
        String.Format("{0}:{1}!={2}",p.Name, aValue, bValue) 
       ); 
     } 
     else 
      differences.AddRange(DiffObjectsProperties(aValue, bValue)); 
    } 

    return differences; 
} 
+0

Ça semble fonctionner, merci! – Jeff

+0

Puisque vous passez dans les objets au lieu du type générique T, vous devez faire ceci je pense: si (a.GetType()! = B.GetType()) renvoyer des différences; – Jeff

1

Si les propriétés ne sont pas des types de valeur, pourquoi ne pas simplement appeler DiffObjectProperties récursivement et ajouter le résultat à la liste actuelle? Vraisemblablement, vous auriez besoin de les parcourir et de préfixer le nom de la propriété en notation par points afin que vous puissiez voir ce qui est différent - ou il suffira peut-être de savoir que si la liste est vide, les propriétés actuelles diffèrent .

0

Parce que je ne sais pas comment dire si:

var v1 = p.GetValue(a, null); 

est une chaîne prenom Rôle rôle. J'ai essayé de savoir comment dire si v1 est une chaîne telle que FirstName ou un rôle de classe. Par conséquent, je ne saurai pas quand passer de façon récursive la propriété d'objet (Role) à DiffObjectsProperties pour itérer ses valeurs de propriété.

Questions connexes