我有一个像这样构建的Metamodel:
class ModelElement
{
string id;
}
class Package : ModelElement
{
List<Package> nestedPackages;
List<Class> ownedClasses;
}
class Class : ModelElement
{
}
现在我已经构建了两个模型,我想检查它们是否相同。我想比较元素的ID,我不想为任何类型的元素编写方法。
Package a; //pretend both have classes
Package b; //and nested packages
compare(a.nestedPackages, b.nestedPackages);
compare(a.ownedClasses; b.OwnedClasses);
由于Class和Package都继承自ModelElement,因此它们都有ID。所以我想编写一个比较ID的函数“compare”。我想过使用Generics但是泛型数据类型没有属性“id”。有什么想法吗?
答案 0 :(得分:4)
您可以查看Enumerable.SequenceEqual
,并结合自定义比较器。
bool equal = Enumerable.SequenceEqual(a.nestedPackages, b.nestedPackages,
new ModelElementComparer());
public class ModelElementComparer : IEqualityComparer<ModelElement>
{
public bool Equals(ModelElement x, ModelElement y)
{
return x.id == y.id;
}
public int GetHashCode(ModelElement obj)
{
return x.id;
}
}
以下是指向this particular SequenceEqual override和IEqualityComparer interface。
的MSDN链接答案 1 :(得分:1)
您可以覆盖ModelElement类上的Object.Equals()方法,而不是编写比较方法
public override bool Equals(Object obj)
{
//Check for null and compare run-time types.
if (obj == null || GetType() != obj.GetType())
return false;
ModelElement m = (ModelElement)obj;
return (id == m.id);
}
如果你这样做,你还需要覆盖Object.GetHashCode()。
答案 2 :(得分:0)
像Linq的Except
这样的自定义比较器可能会在这里工作:
http://msdn.microsoft.com/en-us/library/system.linq.enumerable.except.aspx
空的结果可枚举将意味着没有差异。