我将一个ProductBO对象发布到HttpPost服务,但比较时返回false。
我在运行时添加调试器和评估(QuickWatch)值,这两个类的所有其他成员都相等,但是当我比较product.Equals(testProduct)
时,它返回false。我将数据传递为..
我使用 Postman in raw
传递数据{
"Id" :1,
"Name" : "Tomato Soup",
"Category" :"Groceries",
"Price" : 1
}
,文字类型为application/json
。我做错了什么。以及这是否是更好的传递对象的方法。
public IHttpActionResult GetTestProduct(ProductBO testProduct) {
ProductBO product = new ProductBO { Id = 1, Name = "Tomato Soup", Category = "Groceries", Price = 1 };
if (product.Equals(testProduct)) //also tried for product == testProduct both return false
{
return Ok(product);
}
if (product.Id == testProduct.Id)
{
}
if (product.Name.Equals(testProduct.Name))
{
}
return Ok("working");
}
答案 0 :(得分:4)
对于引用类型,Equals
方法比较对象引用,并返回false
,因为testProduct
和product
指向内存中的2个不同地址。您可以在视图模型上实现IEquatable<T>
接口,以指示如何执行比较:
public class ProductBO : IEquatable<ProductBO>
{
public int Id { get; set; }
public string Name { get; set; }
public bool Equals(ProductBO other)
{
return this.Id == other.Id && this.Name == other.Name;
}
}
答案 1 :(得分:1)
正如docs所说
如果当前实例是引用类型,则为Equals(Object)方法 测试参考相等性,并调用Equals(Object)方法 相当于对ReferenceEquals方法的调用。参考 等式意味着被比较的对象变量是指 同一个对象。
在您的情况下,您想要比较对象的内容而不是它们的引用。实现此目的的简单解决方案是将两个对象序列化为json并比较字符串
JsonConvert.SerializeObject(product) == JsonConvert.SerializeObject(testProduct)