J'ai deux classes adresse et employé comme suit:
var emp1Address = new Address(); emp1Address.AddressLine1 = "Microsoft Corporation"; emp1Address.AddressLine2 = "One Microsoft Way"; emp1Address.City = "Redmond"; emp1Address.State = "WA"; emp1Address.Zip = "98052-6399"; var emp1 = new Employee(); emp1.FirstName = "Bill"; emp1.LastName = "Gates"; emp1.EmployeeAddress = emp1Address; var emp2Address = new Address(); emp2Address.AddressLine1 = "Gates Foundation"; emp2Address.AddressLine2 = "One Microsoft Way"; emp2Address.City = "Redmond"; emp2Address.State = "WA"; emp2Address.Zip = "98052-6399"; var emp2 = new Employee(); emp2.FirstName = "Melinda"; emp2.LastName = "Gates"; emp2.EmployeeAddress = emp2Address;
5 Réponses :
Vous n'avez pas nécessairement besoin de réflexion pour effectuer la comparaison. strong> Vous pouvez écrire une classe de comparaison qui prend deux instances d'employé ou d'adresse et compare chaque champ à laquelle correspondre. Pour tout ce qui ne correspond pas, vous pouvez ajouter une chaîne (ou Si vous retournez un La valeur principale de la réflexion serait d'écrire un comparateur d'objet EM> em> qui pourrait prendre deux instances de tout type d'objet em> et comparer leurs champs et leurs propriétés publiques. Cela aide à éviter de rédiger un code de comparaison répétitif et plus - mais cela ne semble pas être le cas dans lequel vous êtes. P> PropertyInfo code>) sur une liste pour revenir à l'appelant. P>
PropertyInfo code>,
membreInfo code> ou juste une chaîne dépend de ce que l'appelant doit faire avec le résultat. Si vous avez réellement besoin de visiter les champs contenant des différences, le
PropertyInfo / MemberInfo code> peut être meilleur - mais simplement signaler les différences d'une chaîne suffisante. P>
Comme Lbuskin dit, vous n'avez pas à faire cela. Ce n'est pas le moyen le plus rapide! Achetez si vous voulez, essayez ceci:
public static List<PropertyInfo> GetDifferences(Employee test1, Employee test2) { List<PropertyInfo> differences = new List<PropertyInfo>(); foreach (PropertyInfo property in test1.GetType().GetProperties()) { object value1 = property.GetValue(test1, null); object value2 = property.GetValue(test2, null); if (!value1.Equals(value2)) { differences.Add(property); } } return differences; }
C'est une bonne solution, mais pour les listes, cela n'entraînerait pas les résultats corrects, parfois si le paramètre de capacité est différent, même si des entités de liste et les comptes sont égaux.
Si la valeur2 a été changée à NULL, cela entraînera une nullreference
Pas besoin de réflexion. Bien entendu, cet exemple renvoie une chaîne avec les noms de propriétés ... Si vous avez besoin du procédentiel de biensInfo code>, les choses obtiendraient un peu plus difficile, mais pas par beaucoup.
Il a spécifiquement demandé une solution à l'aide de la réflexion et probez-vous à le faire manuellement comme vous le suggérez.
public class Address { public string AddressLine1 { get; set; } public string AddressLine2 { get; set; } public string City { get; set; } public string State { get; set; } public string Zip { get; set; } public override bool Equals(object obj) { if (obj as Address == null) return false; return ((Address) obj).AddressLine1.Equals(AddressLine1); } }
Pourquoi avez-vous besoin d'utiliser la réflexion?
Dupliqué possible de comparer les propriétés d'objet en C #