【发布时间】:2018-12-03 15:34:02
【问题描述】:
我有以下示例。
public class Main
{
public Student Student { get; set; }
public override bool Equals(object obj)
{
if (this.GetType() != obj.GetType()) throw new Exception();
return Student.Age == ((Student)obj).Age;
}
}
public class Student
{
public int Age { get; set; }
public Name Name { get; set; }
public override bool Equals(object obj)
{
if (this.GetType() != obj.GetType()) throw new Exception();
return Age == ((Student)obj).Age;
}
}
public class Name
{
public string FirstName { get; set; }
public string LastName { get; set; }
public override bool Equals(object obj)
{
if (this.GetType() != obj.GetType()) throw new Exception();
return FirstName == ((Name)obj).FirstName && LastName == ((Name)obj).LastName;
}
}
当我尝试序列化时
JsonConvert.SerializeObject(new Main{ ... });
我在 Main 类型的 Equals 方法中得到不同的类型,我会在另一个 Equals 方法中假设不同的类型。
我得到的类型是,对于
this.GetType() // => Main
obj.GetType() // => Student
为什么 json 会这样做,为什么要使用 Equals 方法以及如何使其行为正常?
【问题讨论】:
-
你应该在序列化周围显示代码
-
你认为
this.GetType()会在Main类中返回什么? -
为什么在
Equals覆盖中抛出异常?如果两个对象因为类型不同而不能相等,则它们不相等。这意味着,在这种情况下应该返回false而不是抛出异常。请注意Equals的参数类型是object,换句话说,Equals方法明确允许测试任意对象之间的相等性,包括任意不同类型的对象... -
注意 - 如果您希望使用引用相等,请参阅Why doesn't reference loop detection use reference equality? 的答案中提到的解决方法。
标签: c# json serialization json.net