5

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

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

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

例如,其中_keyProperties[x].GetValue(entity, null)是 aobject{long}并且keyValues[x]是 a object{int}(但它们也可以倒置)。

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

4

1 回答 1

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可能会很慢(尽管为支持它而生成的代码已被缓存,因此至少该部分不会多次执行)。

如果类型不相关,它也可能会出现一些问题 -请参阅此处以获取更多讨论。

例如,这将引发异常:

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

if ((dynamic) obj1 == (dynamic) obj2) // Throws an exception!
    Console.WriteLine("Yes");
else
    Console.WriteLine("No");
于 2013-06-12T08:34:46.810 回答