1

我有一个类型:

class Order
{
  public List<IItem> AllItems { get; set; }
  public string Name { get; set; }
  public double TotalPurchases { get; set; }
  public long Amount { get; set; }
  public int Code { get; set; }
}

我已经实现了IEquatable<T>接口来检查这种类型的两个对象是否相同。当前Equals方法如下所示:

public virtual bool Equals(Order other)
{
  if ((object)other == null)
  {
    return false;
  }
  return (this.AllItems.Equals(other.AllItems)
       && this.Name.Equals(other.Name)
       && this.TotalPurchases.Equals(other.TotalPurchases)
       && this.Amount.Equals(other.Amount))
       && this.Code.Equals(other.Code));
}

但我希望以这样一种方式实现此方法,即它可以动态检查所有现有属性(或者可能是这种类型的某些属性)的相等性,而无需像上面那样显式编写用于比较检查的代码。

希望我能够清楚地表达我的问题。:)

谢谢!

4

2 回答 2

2

您可以编写一个附加到您想要包含在比较中的类型的属性的自定义属性。然后在 Equals 方法中,您可以反映类型并提取所有具有该属性的属性,并对它们进行动态比较。

伪代码:

[AttributeUsage(AttributeTarget.Property)]
class IncludeInComparisonAttribute : Attribute { }

class Order
{
    List<AllItem> Items { get; set; }

    [IncludeInComparison]
    string Name { get; set; }

    long Amount { get; set; }

    [IncludeInComparison]
    int Code { get; set; }

    override bool Equals(Order other)
    {
        Type orderType = typeof(Order);

        foreach (PropertyInfo property in orderType.GetProperties()
        {
            if (property.CustomAttributes.Includes(typeof(IncludeInComparisonAttribute))
            {
                object value1 = property.GetValue(this);
                object value2 = propetty.GetValue(other);

                if (value1.Equals(value2) == false)
                    return false;
            }
        }

        return true;
    }
}

它当然需要比这更复杂一些,但这应该会让你走上正确的轨道:)

于 2011-02-16T08:56:30.497 回答
1

如果两个Orders 的所有属性都相等,则认为它们是相同的。这 4 个属性 Name/TotalPurchases/Amount/Code 没问题,它们的默认比较器正是您想要的。但是对于属性 AllItems(其类型为List<IItem>),您必须说明它们如何认为是相等的。目前您正在使用不正确的引用等于。this.AllItems.Equals(other.AllItems)应该是这样的:

this.AllItems.SequenceEqual(other.AllItems, new ItemComparer())

并且ItemComparer是一个类实现IEqualityComparer<Item>来告诉如何检查两个Items 是否相等。

于 2011-02-16T09:06:19.773 回答