有没有办法在C#中比较不同类型的两个对象?

时间:2017-04-04 14:36:23

标签: c# compare

我已经看到了一些类似的线索,但没有一个能解决我的问题而且我现在已经挣扎到不得不问。

我有两个对象,一个名为Customer,另一个是名为customerDto的数据传输对象。

客户:

public partial class Customer
{
    [DataMember] 
    public int Id { get;  set;}
    [DataMember] 
    public string Title { get;  set;}
    [DataMember] 
    public string FirstName { get;  set;}
    [DataMember] 
    public string Middle { get;  set;}
    [DataMember] 
    public string LastName { get;  set;}
    [DataMember] 
    public string Email { get;  set;}
    [DataMember] 
    public string HomePhone { get;  set;}
    [DataMember] 
    public string MobilePhone { get;  set;}
    [DataMember] 
    public string AddressLine1 { get;  set;}
    [DataMember] 
    public string AddressLine2 { get;  set;}
    [DataMember] 
    public string PostCode { get;  set;}
    [DataMember] 
    public DateTime? DateOfBirth { get;  set;}
    [DataMember][DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
    public string FullName { get; private set;}
  }

public partial class Customer
{
    public virtual ICollection<DeliveryDetail> DeliveryDetails { get; set; }
    public virtual ICollection<Order> Order { get; set; }
}

CustomerDto:

public class CustomerDto : ICloneable
{
    public int Id { get; set; }
    public string AddressLine1 { get; set; }
    public string AddressLine2 { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string PostCode { get; set; }
    public string Title { get; set; }
    public string Email { get; set; }
    public string HomePhone { get; set; }
    public string MobilePhone { get; set; }
    public DateTime? DateOfBirth { get; set; }
}

我需要比较他们共享的属性,但我不想写一个多行if语句,因为这很麻烦。有没有办法可以做到这一点?

我只需要查看他们共享的任何属性是否存在差异。如果一个不同,那么我们可以进步并更新客户。

提前致谢。

6 个答案:

答案 0 :(得分:1)

我认为你在这里寻找的是一个使用反射的foreach循环。

select primary_key from custom_field where cp_entity_id = :cId

答案 1 :(得分:1)

您可以在使用反射的通用方法中执行此操作:

public static bool CompareMatchingProperties<TLeft,TRight>(TLeft lhs, TRight rhs) {
    var allLeft = typeof(TLeft).GetProperties().ToDictionary(p => p.Name);
    var allRight = typeof(TRight).GetProperties().ToDictionary(p => p.Name);
    foreach (var name in allLeft.Keys.Intersect(allRight.Keys)) {
        if (!object.Equals(allLeft[name].GetValue(lhs), allRight[name].GetValue(rhs))) {
            return false;
        }
    }
    return true;
}

我们的想法是从双方类型中获取所有公共属性(请参阅allLeftallRight词典)构建其名称的交集(allLeft.Keys.Intersect(allRight.Keys)在循环中),获取属性被比较的每个对象(allLeft[name].GetValue(lhs)allRight[name].GetValue(rhs))的值,并使用object.Equals进行比较。

Demo.

对于任何此类方法,要记住的一件事是,比较两个没有任何共同属性的对象的结果将返回true。你可以通过要求至少一对属性来匹配来解决这个问题。

答案 2 :(得分:1)

您可以考虑Customer类实现IComparable接口并实现CompareTo(Object obj)方法。

实施IEquatable interface

答案 3 :(得分:0)

您可以编写如下特定方法:

    public bool UpdateCustomer(Customer customer, CustomerDto dto)
    {
        //Get properties from both objects
        System.Reflection.PropertyInfo[] customerProperties = customer.GetType().GetProperties();
        System.Reflection.PropertyInfo[] dtoProperties = dto.GetType().GetProperties();

        //Get properties that have the same name on both objects
        var propertiesToCompare = from customerProp in customerProperties 
                                  join dtoProp in dtoProperties 
                                  on customerProp.Name equals dtoProp.Name
                                  select customerProp;

        foreach (var property in propertiesToCompare)
        {
            if (property.GetValue(customer, null) != property.GetValue(dto, null))
                return true;
        }
        return false;
    }

您可以从两个对象中获取所有属性,然后检查它们共享的任何属性是否具有不同的值。如果是,则该方法返回true。如果没有,则返回false。

答案 4 :(得分:0)

据我所知,CustomerDto是DB的实体,Customer是客户的合约。如何将Customer类型转换为CustomerDto并比较CustomerDto的两个对象?

答案 5 :(得分:0)

如果您需要比较2个对象并且您正在使用C#,我认为这样做的一个好方法是运算符重载。要做到这一点,你可以考虑几点:

  • 所有操作符重载都是静态方法
  • 你有一元运算符和二元运算符。
  • 使比较器运算符超载(&lt;&lt;&gt;&gt;,==,!=,&gt;,&lt;,&gt; =,&lt; =)您必须重载对方运算符。 (例如,如果你过度加载&#34;&gt;&#34;也必须超载&#34;&lt;&#34;)
  • 您必须在所涉及对象的某些类中声明它。

sintaxis是这样的。

    public static ReturnValue operator+(Object a, Object b)
    {
       // Comparison logic
       return value;

    }

对于您的特定问题,您应该执行以下操作:

public static Boolean operator==(Customer cust, CustomerDto custDto)
{
    //Here you code a for or foreach o whatever you want to compare
    //cust with custDto and return true is you found a difference or false
    //if there are no differences

    return booleanValue;
}

然后ovearload!=运算符。要重用代码,您可以回想起另一个比较器:

public static Boolean operator!=(Customer cust, CustomerDto custDto)
    {  
        return !(cust == custDto);
    }

因此,在您的代码中,您可以检查一个Customer对象和一个CustomerDto对象之间是否存在差异,如下所示:

if (customerObject == customerDtoObject)
{
   //Whatever you want
}

希望这会对你有所帮助。