[TestFixture]
public class CompareHelperTest
{
private class C
{
public String P1 { get; set; }
public Int32 P2 { get; set; }
}
[Test]
public void testPropertiesEqual()
{
C c1 = new C();
c1.P1 = "a";
c1.P2 = 5;
C c2 = new C();
c2.P1 = "a";
c2.P2 = 5;
Assert.IsTrue(CompareHelper.PropertiesEqual(c1, c2));
c2.P2 = 6;
Assert.IsFalse(CompareHelper.PropertiesEqual(c1, c2));
c2.P2 = 5;
c2.P1 = "A";
Assert.IsFalse(CompareHelper.PropertiesEqual(c1, c2));
c2.P1 = "a";
}
}
public static class CompareHelper
{
/// <summary>
/// 比较两个对象的所有可读属性是否相等。
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="a"></param>
/// <param name="b"></param>
/// <returns></returns>
public static bool PropertiesEqual<T>(T a, T b)
{
Type t = typeof(T);
foreach (System.Reflection.PropertyInfo pi in t.GetProperties())
{
if (!pi.CanRead)
{
continue;
}
if (!Object.Equals(pi.GetValue(a, null), pi.GetValue(b, null)))
{
return false;
}
}
return true;
}
}