我正在尝试使用JSON.Net模拟外键行为,但我似乎无法找到获得真实引用的方法。
假设我有这个简单的例子:
private static void Main(string[] args)
{
var g1 = new Group {Name = "g1"};
var g2 = new Group {Name = "g2"};
var users = new[]
{
new User{ Username = "truc", Group = g1 },
new User{ Username = "machin", Group = g2 },
new User{ Username = "dom", Group = g2 },
new User{ Username = "boum", Group = g2 }
};
string json = JsonConvert.SerializeObject(users);
var jsonUsers = JsonConvert.DeserializeObject<User[]>(json);
Console.WriteLine(jsonUsers[2].Group == jsonUsers[3].Group);
Console.ReadLine();
}
这里的问题是Console.WriteLine(jsonUsers[2].Group == jsonUsers[3].Group);
始终为假。
我发现使其工作的唯一方法是存储用户列表,然后存储组列表并具有GroupId proprety Inside of users。然后在反序列化所有内容后,我手动插入用户内部组的引用。这是hackish。
解决此问题的最佳方法是什么?
答案 0 :(得分:2)
您正在进行实例比较。您应该覆盖Equals
课程中的GetHashcode
和Group
。由于您在Console.WriteLine
==
运算符,因此运算符重载也会很好
否则;
new Group() { Name = "a" } == new Group() { Name = "a" }
或
new Group() { Name = "a" }.Equals(new Group() { Name = "a" })
将始终返回 false
public class Group
{
public string Name;
public int i;
public static bool operator ==(Group a, Group b)
{
return a.Equals(b);
}
public static bool operator !=(Group a, Group b)
{
return !(a.Name == b.Name);
}
public override bool Equals(object obj)
{
var g = obj as Group;
if (ReferenceEquals(this,g)) return true;
return g.Name.Equals(Name);
}
public override int GetHashCode()
{
return Name.GetHashCode();
}
}