循环遍历C#中的对象属性

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (64)

我有两个相同类型的对象,我想循环遍历每个对象上的公共属性,并提醒用户哪些属性不匹配。

在不知道对象包含哪些属性的情况下,是否可以这样做?

提问于
用户回答回答于

是的,用反射 - 假定每个Equals属性类型都适当地实现。另一种方法是ReflectiveEquals递归地使用除了一些已知的类型之外的所有类型,但这会变得棘手。

public bool ReflectiveEquals(object first, object second)
{
    if (first == null && second == null)
    {
        return true;
    }
    if (first == null || second == null)
    {
        return false;
    }
    Type firstType = first.GetType();
    if (second.GetType() != firstType)
    {
        return false; // Or throw an exception
    }
    // This will only use public properties. Is that enough?
    foreach (PropertyInfo propertyInfo in firstType.GetProperties())
    {
        if (propertyInfo.CanRead)
        {
            object firstValue = propertyInfo.GetValue(first, null);
            object secondValue = propertyInfo.GetValue(second, null);
            if (!object.Equals(firstValue, secondValue))
            {
                return false;
            }
        }
    }
    return true;
}
用户回答回答于

你当然可以通过反射做到。下面是从给定类型获取属性的代码。

var info = typeof(SomeType).GetProperties();

如果你能给出更多的信息,你比较的属性是什么·,我们可以得到一个基本的差分算法。这段代码将在名字上有所区别。

public bool AreDifferent(Type t1, Type t2) {
  var list1 = t1.GetProperties().OrderBy(x => x.Name).Select(x => x.Name);
  var list2 = t2.GetProperties().OrderBy(x => x.Name).Select(x => x.Name);
  return list1.SequenceEqual(list2);
}

扫码关注云+社区

领取腾讯云代金券