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

C# 查找C中两个对象之间的差异#,c#,.net,reflection,C#,.net,Reflection,我正在寻找一种方法,来找出相同类型的两个对象之间的属性值之间的差异 我一直在从这个堆栈溢出问题中的示例着手: 这就是我到目前为止所做的: public static string Compaire<T>(T initial, T final) { Type currentType = initial.GetType(); PropertyInfo[] props = currentType.GetProperties(); StringBuilder sb

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

我一直在从这个堆栈溢出问题中的示例着手:

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

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();
}
公共静态字符串比较(T首字母,T末字母)
{
类型currentType=initial.GetType();
PropertyInfo[]props=currentType.GetProperties();
StringBuilder sb=新的StringBuilder();
foreach(道具中的var道具)
{
Type equatable=prop.PropertyType.GetInterface(“System.IEquatable”);
if(可等式!=null)
{
var i=属性GetValue(初始值);
var f=道具获取值(最终);
如果(i!=null&&f!=null&&i.Equals(f))
{
sb.Append(String.Format({0}.{1}已从{2}更改为{3}.),currentType.BaseType.Name,prop.Name,i,f));
}
}
}
使某人返回字符串();
}
这在大多数情况下都是有效的,但是,可以为null的属性(例如
nullable int
)没有得到比较,因为(我认为)它们没有被取消绑定,并且不能用IEquatable实现nullable


使用这种反射方法,是否可以在仍然避免已处理的实体(例如,“ObjectContext实例已被处理,无法再用于需要连接的操作”)的情况下比较空值?

您可以使用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))
                {
                    //...
                }
            }
        }
if(prop.PropertyType.IsGenericType)
{
if(prop.PropertyType.GetGenericTypeDefinition().Equals(typeof(null)))
{
Type typeParameter=prop.PropertyType.GetGenericArguments()[0];
var i=属性GetValue(初始值);
var f=道具获取值(最终);
if(对象等于(i,f))
{
//...
}
}
}
因此,您需要显式地检查可为null的项。
第一行检查类型是否为泛型(对于可为null的列表等为true),第二行获取基础泛型类型(可为null的列表),并将其与可为null的类型进行比较。第三行获取第一个参数(在仅可为null的情况下),仅针对您感兴趣的可为null的类型。因此,对于Nullable,您将得到int。我编写的代码中不需要它,但您可能对此感兴趣。然后读取并比较两个属性的值。

也许此项目可以满足您的需要:

我确信努吉周围一定有什么东西。FluentAssertions有对象比较,不知道它有多深。我没听说过那个项目。我会测试一下。谢谢它更像是一个用于单元测试的助手库,但只是谷歌搜索一下。应该有东西。嗨,谢谢你的回复!但是,没有一个属性是泛型类型的,根据您的示例,我做到了:“prop.PropertyType.Equals(typeof(Nullable)),这将捕获可为null但不可为null的类型,这可能吗?哦。很抱歉我更正了代码。智能感知欺骗了我。谢谢你的帮助,我已将此标记为正确。因为我的代表不够高,所以我不能投票支持这个回答。