运行时默认值不相等

runtime default values fail equality

我想在运行时对成员属性进行一些比较,但值类型禁止异常行为。

我有类似下面的内容

public static object DefaultValue(this Type type) 
{
    return type.IsValueType ? Activator.CreateInstance(type) : null;
}


class ExampleClass
{
    public string Id { get; set; }
    public string Title { get; set; }
    public decimal Price { get; set; }

    public XElement ToXml()
    {
        var srcTree = from prop in GetType().GetProperties()
                      let value = prop.GetValue(foo, null)
                      where value != prop.PropertyType.DefaultValue()
                      select new XElement(prop.Name.ToLower(), value);

                              ...

    }
}

如果我初始化我的对象new ExampleClass()我找到值为0的价格。我可以确认DefaultValue() returns 0对于在相等期间不等于0的价格比较。是因为现在它正在比较对象或什么。我怎样才能实现我想要的行为?

object DefaultValue(this Type type)

方法returns一个对象,虽然你在方法里判断是否是值类型,用Activator.CreateInstance动态创建类型

但该值将在对象中装箱成为对象类型值而不是您期望的值类型。

当您在 object 类型的表达式上使用 == 时,它将使用 ReferenceEquals 来比较引用而不是值。

 var srcTree = from prop in GetType().GetProperties()
                          let value = prop.GetValue(foo, null)
                          where !Equals(value, prop.PropertyType.DefaultValue())
                          select new XElement(prop.Name.ToLower(), value); 

c# online


这是您案例的示例

我们可以看到defaultVal对象设置了一个值0,是int类型(打拳)。

dymanicVal 通过 Activator.CreateInstance 方法创建 int

然后当我们使用 == 来比较两个对象时,它们将比较它们的引用而不是 int

所以你可以尝试使用 Equals method to compare the value will call RuntimeHelpers.Equals 方法然后比较它们的值而不是引用。

object defaultVal = 0;
object dymanicVal = Activator.CreateInstance(typeof(int));

Console.WriteLine(Equals(defaultVal, dymanicVal)); //True
Console.WriteLine(defaultVal == dymanicVal);      //false

c# online