比较同一个班级的{2}对象

时间:2015-08-06 14:25:18

标签: c# compare

最近,我遇到了在C#中比较同一类的两个对象的问题。我需要知道哪些字段/属性已更改。

以下是示例:

SampleClass 
{
  string sampleField1;
  int sampleField2;
  CustomClass sampleField3; 
}

我有2个SampleClass对象,object1object2。 这两个对象具有一些不同的字段值。

  • 有谁知道获得哪些字段不同的最佳方法?

  • 如何获取不同字段/属性的(字符串)名称?

  • 我在.Net听说过反思。在这种情况下,这是最好的方法吗?
  • 如果我们没有CustomClass字段? (我只是将这个字段用于更通用的方法,在我的情况下该字段不存在)

3 个答案:

答案 0 :(得分:3)

如果您希望通用方式获取所有已更改的属性

您可以使用此方法(并使用反射^ _ ^)

    public List<string> GetChangedProperties(object obj1, object obj2)
    {
        List<string> result = new List<string>();

        if(obj1 == null || obj2 == null )
            // just return empty result
            return result;

        if (obj1.GetType() != obj2.GetType())
            throw new InvalidOperationException("Two objects should be from the same type");

        Type objectType = obj1.GetType();
          // check if the objects are primitive types
        if (objectType.IsPrimitive || objectType == typeof(Decimal) || objectType == typeof(String) )
            {
                // here we shouldn't get properties because its just   primitive :)
                if (!object.Equals(obj1, obj2))
                    result.Add("Value");
                return result;
            }

        var properties = objectType.GetProperties();

        foreach (var property in properties)
        {
            if (!object.Equals(property.GetValue(obj1), property.GetValue(obj2)))
            {
                result.Add(property.Name);
            }
        }

        return result;

    }

请注意,此方法仅获取已更改的Primitive type properties和引用同一实例的引用类型属性

编辑:如果obj1obj2是原始类型(int,string ...),则添加验证,因为我试图传递字符串对象,它会给出一个错误 还修复了检查这两个值是否为equal

的错误

答案 1 :(得分:2)

稍微修改了此处发布的另一个答案,但是此问题适用于非string类型的属性,不使用内部列表并自动进行一些初步类型检查,因为它通用

public IEnumerable<string> ChangedFields<T>(T first, T second)
{
    if (obj1.GetType() != obj2.GetType())
        throw new ArgumentOutOfRangeException("Objects should be of the same type");

    var properties = first
        .GetType()
        .GetProperties();

    foreach (var property in properties)
    {
        if(!object.Equals(property.GetValue(first), property.GetValue(second)))
        {
            yield return property.Name;
        }
    }
}

答案 2 :(得分:2)

如果您需要将两个对象作为业务逻辑的一部分进行比较,那么除非您可以为每种类型编写比较器类。

如果你想在调试期间在运行时比较两个对象,有一个叫做Oz Code的简洁插件可以为你做到这一点,如下所示:

enter image description here