比较c#中的框对象

本文关键字:对象 比较 | 更新日期: 2023-09-27 18:18:04

是否有可能在编译时不知道的情况下比较两个对象 ?例如,如果我有一个object{long}object{int},有没有一种方法可以知道盒子里的值是否相等?

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

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

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

我需要这个,因为我正在为我的单元测试构建一个模拟存储库,并且我已经开始包括这里描述的通用存储库实现。这个实现在它的Find方法中比较了两个通用的伪db键。

比较c#中的框对象

对于您的情况来说,这可能太慢了,但是您可以使用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");