在C#中找出两个对象之间的差异

时间:2015-03-23 21:00:55

标签: c# .net reflection

我正在寻找一种方法来找出两个相同类型的对象之间的属性值之间的差异。

我一直在这个堆栈溢出问题的例子中工作:

Finding property differences between two C# objects

这是我到目前为止所做的:

public static string Compaire<T>(T initial, T final)
{
    Type currentType = initial.GetType();
    PropertyInfo[] props = currentType.GetProperties();
    StringBuilder sb = new StringBuilder();

    foreach (var prop in props)
    {

        Type equatable = prop.PropertyType.GetInterface("System.IEquatable");

        if (equatable != null)
        {
            var i = prop.GetValue(initial);
            var f = prop.GetValue(final);

            if (i!= null && f != null && !i.Equals(f))
            {
                sb.Append(String.Format(_"{0}.{1} has changed from {2} to {3}. ", currentType.BaseType.Name, prop.Name, i, f));
            }
        }

    }
    return sb.ToString();
}

这适用于大多数情况,但是,可空属性(例如Nullable int)没有得到比较,因为(我认为)它们没有被取消装箱并且可以使用IEquatable实现可空。

使用这种反射方法,是否可以比较nullables,同时仍然避免已经处置的实体(例如“已经处置了ObjectContext实例,并且不能再用于需要连接的操作”)?

2 个答案:

答案 0 :(得分:1)

您可以使用object.Equals(i,f)并省略对IEquatable的检查。如果它是必要的,但你想包括nullables,你可以通过以下方式包括它们:

        if (prop.PropertyType.IsGenericType)
        {
            if (prop.PropertyType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
            {
                Type typeParameter = prop.PropertyType.GetGenericArguments()[0];

                var i = prop.GetValue(initial);
                var f = prop.GetValue(final);  
                if(object.Equals(i,f))
                {
                    //...
                }
            }
        }

因此,您明确检查Nullables。 第一行检查类型是否是通用的(对于Nullable List等是真的)第二行检索基础泛型类型(Nullable&lt;&gt;,List&lt;&gt;)并将其与Nullable&lt;&gt;进行比较。类型。第三行获取第一行(并且仅在Nullable&lt;&gt;的情况下)参数,仅针对您感兴趣的Nullable类型的情况。所以你将获得Nullable的int。在我编写的代码中不需要它,但也许您对此感兴趣。然后读取并比较两个属性的值。

答案 1 :(得分:1)

也许这个项目可以满足您的需求: CompareNetObjects