Question

  

voir aussi Hows pour vérifier rapidement si les données   transfert de deux objets ont le même   propriétés en C #?

J'ai beaucoup d'objets de transfert de données (DTO) que chaque contient beaucoup de champs simples . Je dois equals sur tous (donc je peux écrire des tests unitaires hors les transporter var WCF).

Le code J'utilise est:

public override bool Equals(object rhs)
{

    RequestArguments other = rhs as RequestArguments;

    return
       other != null && 
       other.m_RequestId.Equals(RequestId) && 
       other.m_Type.Equals(m_Type) && 
       other.m_Parameters.Equals(m_Parameters) && 
       other.m_user.Equals(m_user);
}

Il doit y avoir une meilleure façon! ... (liste de tous les champs est plutôt demander des erreurs et des problèmes d'entretien)

par exemple. nous avons l'objet. MemberwiseClone () pour aider le cas de clonage (), mais je ne peux pas trouver quoi que ce soit pour aider à Equals. Nous courons en pleine confiance pour une solution de réflexion est une réponse, mais je préfère ne pas réinventer la roue.

(Désolé, nous ne générons pas le DTO d'une langue spécifique à un domaine autrement ce genre de chose serait facile! Aussi je ne suis pas en mesure de changer le système de construction pour ajouter une autre étape)

Était-ce utile?

La solution

drôle que vous devriez demander, j'ai récemment publié un code pour faire exactement cela. Regarde mes MemberwiseEqualityComparer pour voir si elle répond à vos besoins.

Il est vraiment facile à utiliser et très efficace aussi. Il utilise l'IL-émettre pour générer l'ensemble des pairs et la fonction GetHashCode sur la première course (une fois pour chaque type utilisé). Il comparera chaque champ (privé ou public) de l'objet donné en utilisant le comparateur d'égalité par défaut pour ce type (EqualityComparer.Default). Nous l'avons utilisé dans la production pendant un certain temps et il semble stable, mais je vais laisser aucune garantie =)

Il prend soin de tous les pescy bord des cas que vous pensez rarement quand vous rouler votre propre méthode equals (c.-à-vous ne pouvez pas comparateur votre propre objet avec nul, sauf si vous avez mis en boîte dans un premier objet et beaucoup de problèmes de plus liés null).

Je voulais écrire un billet de blog à ce sujet, mais ne l'ai pas eu l'occasion de encore. Le code est un peu en situation irrégulière, mais si vous aimez je pouvais nettoyer un peu.

public override int GetHashCode()
{
    return MemberwiseEqualityComparer<Foo>.Default.GetHashCode(this);
}

public override bool Equals(object obj)
{
    if (obj == null)
        return false;

    return Equals(obj as Foo);
}

public override bool Equals(Foo other)
{
    return MemberwiseEqualityComparer<Foo>.Default.Equals(this, other);
}

Le MemberwiseEqualityComparer est libéré sous la licence MIT meaining vous pouvez faire à peu près tout ce que vous voulez avec elle, y compris l'utilisation dans des solutions propriétaires sans vous changer de licence un peu.

Autres conseils

Une option consiste à utiliser la réflexion pour obtenir tous les champs disponibles, puis obtenir et de comparer leurs valeurs sur les objets souhaités. Cela vous donne une solution générique, mais vous auriez tout un travail à faire, en utilisant probablement hash comme le suggère Alex est une solution plus propre.

EDIT : Voici un exemple simple de comparer des objets en utilisant la réflexion, il se penche sur les propriétés des champs à la place, mais vous voyez l'idée: http://www.willasrari.com/blog/use-systemreflection-for-comparing-custom-objects/ 000257.aspx

Vous pouvez avoir un concept d'un hachage objet - chaque fois qu'un objet change, vous payez le prix de mise à jour du hachage (où le hachage est littéralement un hachage de toutes les propriétés chaînées). Ensuite, si vous avez un tas d'objets qui changent rarement, il est vraiment pas cher pour les comparer. Le prix, bien sûr, est alors payé au moment de l'édition d'objets.

Modifier : désolé, je ne l'ai pas remarqué que vous demandez des tests de sérialisation. Donc, cette approche ne fonctionne pas vraiment pour vous.


Il y a une autre façon « sale ». Si votre objet est sérialisable de toute façon, vous pouvez serialize les comparer et les cours d'eau résultant.

Ceci est plutôt lent, mais devrait être tout à fait fiable et facile à mettre en œuvre.

Nous faisons cela parfois pour vérifier si quelqu'un a changé toutes les données dans un éditeur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top