Copy internal class ArrayEquality : IEquality
{ public Func MatchCondition
{ get
{ return p => p.GetType().IsArray;
}
} public bool IsEqual(object source, object target) {
Array s = source as Array;
Array t = target as Array; if (s.Length != t.Length)
{ return false;
}
for (var i = 0; i < s.Length; i++)
{ var equality = EqualityCollection.Equalities
.First(p => p.MatchCondition(s.GetValue(i))); var result = equality.IsEqual(s.GetValue(i), t.GetValue(i)); if (!result)
{ return false;
}
} return true;
}
}
数组相等的判断类似集合,我们首先判断数组的长度是否一致,然后判断对应位置的元素是否一致。
类判断相等实现类
Copy internal class ClassEquality : IEquality
{ public Func MatchCondition
{ get
{ return p => p.GetType().IsClass;
}
} public bool IsEqual(object source, object target) { var type = source.GetType(); foreach (var prop in type.GetProperties())
{ var equality = EqualityCollection.Equalities
.First(p => p.MatchCondition(prop.GetValue(source))); var result = equality.IsEqual(prop.GetValue(source), prop.GetValue(target)); if (!result)
{ return false;
}
} return true;
}
}
添加判断相等实现类集合
Copy public static class EqualityCollection
{ public static readonly List Equalities = new List { new StructEquality(), new ValueTypeEquality(), new ArrayEquality(), new GenericCollectionEquality(), new ClassEquality()
};
}
Copy public struct DemoStruct
{ public int Id { get; set; } public string Name { get; set; }
}
Copy var a = new DemoStruct();
a.Id = 1;
a.Name = "Test"; var b = new DemoStruct();
b.Id = 1;
b.Name = "Test";
var c = new DemoStruct();
b.Id = 2;
b.Name = "Test";
ObjectEquality objectEquality = new ObjectEquality();
objectEquality.IsEqual(a,b); //true
objectEquality.IsEqual(a,c); //false
对比类
Copy public class SimpleClass
{ public int Id { get; set; } public string Name { get; set; }
}
Copy var a = new SimpleClass
{
Id = 1,
Name = "A"
}; var b = new SimpleClass
{
Id = 1,
Name = "A"
};
var c = new SimpleClass
{
Id = 2,
Name = "A"
};
ObjectEquality objectEquality = new ObjectEquality();
objectEquality.IsEqual(a,b); //true
objectEquality.IsEqual(a,c); //false
对比数组
Copy var a = new int[] { 1, 2, 3 }; var b = new int[] { 1, 2, 3 }; var c = new int[] { 1, 1, 2 };
ObjectEquality objectEquality = new ObjectEquality();
objectEquality.IsEqual(a,b); //true
objectEquality.IsEqual(a,c); //false