比较C#中的盒装对象

时间:2013-06-12 08:18:15

标签: c# types casting comparison type-conversion

是否可以比较两个没有的对象在编译时知道它们的盒装类型? 例如,如果我有object{long}object{int},有没有办法知道盒装值是否相等?

我的方法检索两个通用object,并且在编译时无法知道它们的内部类型是什么。现在,通过以下代码进行比较:

_keyProperties[x].GetValue(entity, null).Equals(keyValues[x])

其中,例如,_keyProperties[x].GetValue(entity, null)object{long}keyValues[x]object{int}(但也可以反转)。

我需要这个,因为我正在为我的单元测试构建一个模拟存储库,我已经开始包含一个如here所述的通用存储库实现。此实现在其Find方法中比较了两个通用伪数据库密钥。

1 个答案:

答案 0 :(得分:2)

对于您的情况,这可能太慢,但您可以使用dynamic进行测试,如以下代码所示:

object obj1 = 1;
object obj2 = 1.0;

if (obj1.Equals(obj2))
    Console.WriteLine("Yes");
else
    Console.WriteLine("No"); // Prints "No" as you'd expect.

if ((dynamic) obj1 == (dynamic) obj2)
    Console.WriteLine("Yes"); // Prints "Yes" because it handles trivial conversions.
else
    Console.WriteLine("No");

请注意,使用dynamic可能会很慢(尽管为支持它而生成的代码会被缓存,因此至少该部分不会执行多次)。

如果类型不相关,它也可能会出现一些问题 - see here for more discussion.

例如,这将引发异常:

object obj1 = "Hello";
object obj2 = 1.0;

if ((dynamic) obj1 == (dynamic) obj2) // Throws an exception!
    Console.WriteLine("Yes");
else
    Console.WriteLine("No");