2013-04-25 55 views
0

这里是情况。我有两个未知类型的对象,我想比较一下它们是否与另一个类型相同。两者都可以是string,int,enumerable或任何您可以想象的自定义类。有没有办法使用反射来实现这一点?比较两个未知类型的对象

谢谢!

+0

类型是否相同? – 2kay 2013-04-25 17:48:13

+0

它们应该是,如果它们不是,我会说它们不相等 – user2161442 2013-04-25 17:49:26

+0

可以使用[is关键字](http://msdn.microsoft.com/en-us/library/scekt9xw(v = vs。 71)的.aspx)?你能否做'如果(a是b)'?我不知道这是否可以在我的头顶工作,值得一试 – tnw 2013-04-25 17:50:17

回答

0

在一般情况下,您可以使用来自对象的Equals方法。

object first = GetFirst(); 
object second = GetSecond(); 

bool areEqual = object.Equals(first, second); 

写一个特定功能(通常是一个通用的函数)需要比较在编译时不知道被接受的IEqualityComparer,因此,如果类型不具有Equals实现这类型时,另一种选择在上下文中适当的调用你的方法(或你的类型的用户,如果它是为整个类)可以提供他们自己的实现。一个很好的例子就是如string.Contains这样的方法。有一个可选的超载,它接受一个IEqualityComparer<char>,让调用者定义两个字符相等的含义。

+0

这将无法正常工作,我无法使用对象类equals方法比较自定义类型的两个对象.. – user2161442 2013-04-25 17:51:20

+1

@ user2161442当然,如果类使用了一个合理的“Equals”实现(您期望的对象在这个庄园应该做的比较)。如果它没有,请参阅编辑。 – Servy 2013-04-25 17:53:55

0

如果您的课程重写Equals,请使用Servy的方法。否则,您可以使用CompareNetObjects库(在nuget上可用)。

Here是通过公共属性比较两个对象的示例。

1

使用Object.ReferenceEqualsGetType

示例从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