在 C# 中查找两个对象之间的差异
Find difference between two objects in C#
我正在寻找一种方法来找出相同类型的两个对象之间的属性值之间的差异。
我一直在研究这个堆栈溢出问题中的示例:
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 实现。
使用这种反射方法,是否可以在比较可空值的同时仍然避免已处置的实体(例如 "The ObjectContext instance has been disposed and can no longer be used for operations that require a connection")?
您可以使用 object.Equals(i,f) 并省略对 IEquatable 的检查。如果这是必要的,但你想包含可空值,你可以通过以下方式包含它们:
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<>、List<>)并将其与 Nullable<> 类型进行比较。第三行获取第一个(并且仅在 Nullable<> 的情况下)参数,以防您对 Nullable 的类型感兴趣。因此,您将获得 Nullable 的 int。我编写的代码中不需要它,但也许您对它感兴趣。然后读取并比较两个属性的值。
也许这个项目可以满足您的需求:
CompareNetObjects
我正在寻找一种方法来找出相同类型的两个对象之间的属性值之间的差异。
我一直在研究这个堆栈溢出问题中的示例:
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 实现。
使用这种反射方法,是否可以在比较可空值的同时仍然避免已处置的实体(例如 "The ObjectContext instance has been disposed and can no longer be used for operations that require a connection")?
您可以使用 object.Equals(i,f) 并省略对 IEquatable 的检查。如果这是必要的,但你想包含可空值,你可以通过以下方式包含它们:
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<>、List<>)并将其与 Nullable<> 类型进行比较。第三行获取第一个(并且仅在 Nullable<> 的情况下)参数,以防您对 Nullable 的类型感兴趣。因此,您将获得 Nullable 的 int。我编写的代码中不需要它,但也许您对它感兴趣。然后读取并比较两个属性的值。
也许这个项目可以满足您的需求: CompareNetObjects