是否可以比较两个没有的对象在编译时知道它们的盒装类型?
例如,如果我有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
方法中比较了两个通用伪数据库密钥。
答案 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");