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方法中比较两个通用伪数据库键.
这对于您的情况来说可能太慢,但您可以使用它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)