“比较”可能不是您想要做的事情。在这种情况下,这个词已经具有共同的含义。我们比较对象是否相等,它返回一个boolean——它们相等或不相等。或者我们比较它们,看看哪个更大。这将返回一个int,它可以指示一个或另一个更大,或者它们相等。这在对对象进行排序时很有帮助。
您要做的是确定对象之间的具体差异。我不会尝试编写一些通用的东西来处理不同类型的对象,除非你想让它们变得非常简单。当您进入返回其他复杂对象或集合或复杂对象集合的属性时,这变得非常复杂。与编写一个比较您要比较的特定类型的方法相比,这并非不可能,只是很少值得付出努力。
这里有一些接口和类可以使任务更容易和更一致。但老实说,很难说该怎么做。同样,如果您要处理嵌套的复杂属性,它会变得复杂。如果两个属性都包含其他对象的列表,并且这些列表中的所有项目都相同,除了每一侧具有不同属性的项目之外,会发生什么情况。或者如果它们都不同呢?在那种情况下,您将如何描述父对象的“不平等”?知道它们相等或不相等可能很有用,但以某种方式描述差异就不那么有用了。
public interface IInstanceComparer<T>
{
IEnumerable<PropertyDifference> GetDifferences(T left, T right);
}
public abstract class InstanceComparer<T> : IInstanceComparer<T>
{
public IEnumerable<PropertyDifference> GetDifferences(T left, T right)
{
var result = new List<PropertyDifference>();
PopulateDifferences(left, right, result);
return result;
}
public abstract void PopulateDifferences(T left, T right,
List<PropertyDifference> differences);
}
public class PropertyDifference
{
public PropertyDifference(string propertyName, string leftValue,
string rightValue)
{
PropertyName = propertyName;
LeftValue = leftValue;
RightValue = rightValue;
}
public string PropertyName { get; }
public string LeftValue { get; }
public string RightValue { get; }
}
public class Animal
{
public string Name { get; }
public int NumberOfLimbs { get; }
public DateTime Created { get; }
}
public class AnimalDifferenceComparer : InstanceComparer<Animal>
{
public override void PopulateDifferences(Animal left, Animal right,
List<PropertyDifference> differences)
{
if(left.Name != right.Name)
differences.Add(new PropertyDifference("Name", left.Name, right.Name));
if(left.NumberOfLimbs!=right.NumberOfLimbs)
differences.Add(new PropertyDifference("NumberOfLimbs",
left.NumberOfLimbs.ToString(),
right.NumberOfLimbs.ToString()));
}
}