运行时默认值不相等
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);
这是您案例的示例
我们可以看到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
我想在运行时对成员属性进行一些比较,但值类型禁止异常行为。
我有类似下面的内容
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);
这是您案例的示例
我们可以看到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