我已经看到了一些类似的线索,但没有一个能解决我的问题而且我现在已经挣扎到不得不问。
我有两个对象,一个名为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语句,因为这很麻烦。有没有办法可以做到这一点?
我只需要查看他们共享的任何属性是否存在差异。如果一个不同,那么我们可以进步并更新客户。
提前致谢。
答案 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;
}
我们的想法是从双方类型中获取所有公共属性(请参阅allLeft
和allRight
词典)构建其名称的交集(allLeft.Keys.Intersect(allRight.Keys)
在循环中),获取属性被比较的每个对象(allLeft[name].GetValue(lhs)
和allRight[name].GetValue(rhs)
)的值,并使用object.Equals
进行比较。
对于任何此类方法,要记住的一件事是,比较两个没有任何共同属性的对象的结果将返回true
。你可以通过要求至少一对属性来匹配来解决这个问题。
答案 2 :(得分:1)
答案 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#,我认为这样做的一个好方法是运算符重载。要做到这一点,你可以考虑几点:
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
}
希望这会对你有所帮助。