【发布时间】:2014-11-10 23:26:04
【问题描述】:
我想做this question 之类的事情,但它没有按我的预期工作。
我有一个对象属性及其类型的列表、一个未知对象以及一个我想从对象中忽略的默认值类型列表。
public void GetOnlyNonDefault(object oObject, IgnoreValues ignoreValues)
{
//properties is set beforehand
for (int i = 0; i < properties.Count; i++)
{
object originalValue =
oObject
.GetType()
.GetProperty(properties[i].Name)
.GetValue(oObject, null);
//retrieving the default value I want to ignore for this property
object ignoreValue = ignoreValues.GetDefaultOf(properties[i]);
//Problem here
//This doesn't work
if (originalValue == ignoreValue) { continue; }
//This works for nearly everything BUT enums
if (ValueType.Equals(originalValue, ignoreValue)) { continue; }
}
}
我从here 读到枚举的默认值为零,这就是当类型为枚举时我从GetDefaultOf 返回的值。
如何按值对上述代码中的所有值类型(包括枚举)进行比较?
编辑:可能是相关的,但我在 oObject 类中使用的枚举没有任何值设置为 0,它们都从 1 开始。
public enum UserStatus
{
Regular = 1, Manager = 2, Director = 3, Admin = 4
}
Edit²:这是我正在尝试执行的代码的基本版本,给出了我遇到的结果:http://pastebin.com/rfJA9CGp
我无法真正更改枚举,因为这就是这段代码的重点,我不知道运行时的对象是什么,也不知道它的属性,但我想计算与定义的默认值不同的任何值(类 @ 987654328@ 包含所有值类型的默认值)。
当它是一个枚举时,我无法转换为 int,因为这样我会忽略代码中实际上定义了带有 0 的枚举的情况,所以我正在寻找任何方法来比较这些值.
【问题讨论】:
-
当比较
Objects you need to use the.Equals` 而不是==尝试将这一行if (originalValue == ignoreValue)更改为此,看看它是否产生预期的结果if (originalValue.Equals(ignoreValue){ continue;} -
@DJKRAZE 给出相同的结果(错误)。这和
Object.Equals()一样不是吗?ValueType.Equals应该是相同的,但适用于 ValueTypes(我认为 Enum 是)。 -
附带说明,对象的属性(PropertyInfo)将始终相同,因此您可以在
oObject.GetType().GetProperty()的循环之外设置一个值,而不是每次都使用反射。 -
“这不起作用”是什么意思?这是否意味着该行抛出异常?比较两个值,即使它们看起来相等,但它们不是吗?还有什么?
-
如果您在给您带来麻烦的行上设置了断点,
originalValue和ignoreValue的值是多少,它们与您的预期有何不同?