情况是这样的。我有两个未知类型的对象,我想比较它们是否相同。两者都可以是string、int、enumerable或任何你能想到的自定义类。有没有办法使用反射来实现这个?
谢谢!
一般情况下使用对象的Equals
方法。
object first = GetFirst();
object second = GetSecond();
bool areEqual = object.Equals(first, second);
当编写一个特定的函数(通常是泛型函数)需要比较编译时不知道的类型时,另一个选择是接受IEqualityComparer
,这样如果该类型在上下文中没有合适的Equals
实现,则方法的调用者(或类型的用户,如果是整个类)可以提供自己的实现。string.Contains
等方法就是一个很好的例子。有一个可选的重载,它接受一个IEqualityComparer<char>
,允许调用者定义两个字符相等的含义。
使用Object.ReferenceEquals
和GetType
从MSDN中提取的示例:
int n1 = 12;
int n2 = 82;
long n3 = 12;
Console.WriteLine("n1 and n2 are the same type: {0}",
Object.ReferenceEquals(n1.GetType(), n2.GetType()));
Console.WriteLine("n1 and n3 are the same type: {0}",
Object.ReferenceEquals(n1.GetType(), n3.GetType()));
// The example displays the following output:
// n1 and n2 are the same type: True
// n1 and n3 are the same type: False
来源:http://msdn.microsoft.com/en-us/library/system.object.gettype.aspx
然而,我可能误解了。这将只检查它们是否为相同类型,使用此方法,具有不同引用的相同类型的两个对象仍然会计算为true
。
如果您的类覆盖Equals
,请使用Servy的方法。否则,您可以使用CompareNetObjects库(在nuget上可用)。
下面是一个比较两个对象的公共属性的例子