比较对象类型的类属性

考斯蒂克斯

我试图记录对象的每个属性的历史记录,仅当它已更改后才对其进行更新。我决定不遍历每个属性的if语句,而是遍历我定义了自定义属性的每个属性,以过滤掉我不想记录的属性,然后比较旧值和新值以查看是否他们已经改变了。

但是,检查每个obj情况是否相等似乎非常大,并且是非常具体的情况,因为我也有要比较的枚举类型。有没有更好的方法可以完成此操作或重构我的代码?

程式码范例

我的课

public class MyClassDto
{
        [Comparible]
        public MyCustomType CustomType{ get; set; }

        [Comparible]
        public DateTime? SomeDate { get; set; }

        [Comparible]
        public decimal? SomeDecimalValue { get; set; }

        [Comparible]
        public int? SomeIntValue { get; set; }

       // Other Non Custom Attribute Type Properties
}

添加历史记录助手功能

public void AddHistory(MyClassDto prevMyObject, MyClassDto newMyObject)
{
      if (prevMyObject== null || newMyObject == null) return;

      foreach (var property in prevMyObject.GetType().GetProperties().Where(prop => Attribute.IsDefined(prop, typeof (ComparibleAttribute))))
      {
          var fieldName = property.Name;
          object prevValue = property.GetValue(prevMyObject, null);
          object newValue = newMyObject.GetType().GetProperty(property.Name).GetValue(newMyObject, null);

           if (!IsEqual(prevValue, newValue))
           {
               //Log the field, prevValue, newValue
           }
       }
  }

对象比较功能

   private static bool IsEqual(object obj1, object obj2)
    {
        if (obj1 == null && obj2 == null || obj1 == obj2) return true;
        if (obj1 == null || obj2 == null) return false;

        var objType = obj1.GetType();
        if (objType == typeof (string))
        {
            return string.Equals(obj1.ToString(), obj2.ToString());
        }
        if (objType == typeof (int?))
        {
            return (Convert.ToInt32(obj1) == Convert.ToInt32(obj2));
        }
        if (objType == typeof (decimal?) || objType == typeof (decimal))
        {
            return (decimal.Round(Convert.ToDecimal(obj1), 2) == decimal.Round(Convert.ToDecimal(obj2), 2));
        }
        if (objType == typeof (DateTime?) || objType == typeof (DateTime))
        {
            return (Convert.ToDateTime(obj1) == Convert.ToDateTime(obj2));
        }
        if (objType == typeof (ContractTrackerType))
        {
            return (((MyCustomType) obj1).Name() == ((MyCustomType ) obj2).Name());
        }

        return false;
    }
麦加纳格

实际上,您不需要原始类型的单独大小写。对于您的自定义类型,应该让它们重写object.Equals,以便将相等性测试逻辑封装在类中。

这样,您的IsEqual函数应该只是对以下内容的调用object.Equals

 private static bool IsEqual(object obj1, object obj2)
 {
     return object.Equals(obj1, obj2);
 }

从以下注释object.Equals

静态Equals(Object,Object)方法指示两个对象objA和objB是否相等。它还使您能够测试值等于null的对象是否相等。它将objA和objB的相等性进行比较,如下所示:

它确定两个对象是否代表相同的对象引用。如果它们这样做,则该方法返回true。此测试等效于调用ReferenceEquals方法。另外,如果objA和objB均为null,则该方法返回true。

它确定objA或objB是否为null。如果是这样,则返回false。

如果两个对象不表示相同的对象引用,并且两个都不为null,则它将调用objA.Equals(objB)并返回结果。这意味着,如果objA重写Object.Equals(Object)方法,则将调用此重写。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

比较对象类型的类属性

来自分类Dev

类型比较中的私有类属性

来自分类Dev

比较类属性

来自分类Dev

比较对象的属性值而不是对象类型

来自分类Dev

类属性的通用类型

来自分类Dev

比较#由类属性的属性对比排序

来自分类Dev

CollectionViewSource作为类属性类型

来自分类Dev

如何声明类属性的类型?

来自分类Dev

类属性的多种类型

来自分类Dev

通过反射区分类属性类型

来自分类Dev

在Python中列出类属性及其类型

来自分类Dev

Cython扩展类型支持类属性吗?

来自分类Dev

类属性未扩展为继承的类型

来自分类Dev

查找数据类属性的类型提示名称

来自分类Dev

通过反射区分类属性类型

来自分类Dev

对象不支持的类属性

来自分类Dev

在类属性中分配空对象?

来自分类Dev

在对象/类属性之间共享变量

来自分类Dev

读取对象的隐藏类属性但被输出混淆

来自分类Dev

php 对象上的相同类属性

来自分类Dev

更改一个类属性的数据类型会在构造子类对象的过程中导致段错误

来自分类Dev

对象相等比较打字稿。无法将对象属性应用于通用类型

来自分类Dev

python函数作为类属性-AttributeError:对象没有属性

来自分类Dev

在加载对象/创建对象时设置基类属性值

来自分类Dev

用比较器比较不同的对象类型

来自分类Dev

了解PHP对象类型比较

来自分类Dev

对象比较于基本类型

来自分类Dev

比较列表中对象的属性

来自分类Dev

比较列表中对象的属性