Advertisement
Guest User

Untitled

a guest
Sep 17th, 2019
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.37 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Reflection;
  4.  
  5. namespace SharedKernel
  6. {
  7.     public abstract class ValueObject<T> : IEquatable<T>
  8.         where T : ValueObject<T>
  9.     {
  10.         public virtual bool Equals(T other)
  11.         {
  12.             if (other == null)
  13.                 return false;
  14.  
  15.             var t = GetType();
  16.             var otherType = other.GetType();
  17.  
  18.             if (t != otherType)
  19.                 return false;
  20.  
  21.             var fields = t.GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
  22.  
  23.             foreach (var field in fields)
  24.             {
  25.                 var value1 = field.GetValue(other);
  26.                 var value2 = field.GetValue(this);
  27.  
  28.                 if (value1 == null)
  29.                 {
  30.                     if (value2 != null)
  31.                         return false;
  32.                 }
  33.                 else if (!value1.Equals(value2))
  34.                     return false;
  35.             }
  36.  
  37.             return true;
  38.         }
  39.  
  40.         public override bool Equals(object obj)
  41.         {
  42.             if (obj == null)
  43.                 return false;
  44.  
  45.             var other = obj as T;
  46.  
  47.             return Equals(other);
  48.         }
  49.  
  50.         public override int GetHashCode()
  51.         {
  52.             var fields = GetFields();
  53.  
  54.             var startValue = 17;
  55.             var multiplier = 59;
  56.  
  57.             var hashCode = startValue;
  58.  
  59.             foreach (var field in fields)
  60.             {
  61.                 var value = field.GetValue(this);
  62.  
  63.                 if (value != null)
  64.                     hashCode = hashCode * multiplier + value.GetHashCode();
  65.             }
  66.  
  67.             return hashCode;
  68.         }
  69.  
  70.         private IEnumerable<FieldInfo> GetFields()
  71.         {
  72.             var t = GetType();
  73.  
  74.             var fields = new List<FieldInfo>();
  75.  
  76.             while (t != typeof(object))
  77.             {
  78.                 fields.AddRange(t.GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public));
  79.  
  80.                 t = t.BaseType;
  81.             }
  82.  
  83.             return fields;
  84.         }
  85.  
  86.         public static bool operator ==(ValueObject<T> x, ValueObject<T> y)
  87.         {
  88.             return x.Equals(y);
  89.         }
  90.  
  91.         public static bool operator !=(ValueObject<T> x, ValueObject<T> y)
  92.         {
  93.             return !(x == y);
  94.         }
  95.     }
  96. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement