比较C#中的盒装对象

fra*_*llo 5 c# comparison types casting type-conversion

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

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

_keyProperties[x].GetValue(entity, null).Equals(keyValues[x])
Run Code Online (Sandbox Code Playgroud)

其中,比方说_keyProperties[x].GetValue(entity, null)是a object{long}keyValues[x]a object{int}(但也可以倒置).

我需要这个,因为我正在为我的单元测试构建一个模拟存储库,我已经开始通过包含这里描述的通用存储库实现.此实现在其Find方法中比较两个通用伪数据库键.

Mat*_*son 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");
Run Code Online (Sandbox Code Playgroud)

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

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

例如,这将引发异常:

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

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