【问题标题】:C# get property value with reflection has not default valueC#通过反射获取属性值没有默认值
【发布时间】:2021-02-11 15:20:37
【问题描述】:

我有这个代码:

messageDto = new CorrelationDto()
{
timestamp = default,
};

var isDefault = messageDto.GetType().GetProperty("timestamp").GetValue(messageDto) == default; // FALSE
var isDefault2 = messageDto.timestamp == default; // TRUE

其中时间戳是一个日期时间。

如您所见,通过反射获取值并与默认值进行比较返回 false。您知道为什么会发生这种情况以及我应该如何检查默认值吗? 谢谢

== 编辑 ==

有人指出 GetValue() 的返回值是一个对象,因此必须将其强制转换为 DateTime 才能使默认值起作用。不幸的是,我不能,因为我正在对对象的所有属性运行此测试以发现该对象是否已初始化(因此我检查 null 或默认值)。而messageDto实际上是一个泛型类型,所以我不知道它的属性类型是先验的。

【问题讨论】:

  • 您的原始问题已得到解答。您的修改构成了一个不同的问题。
  • 您能找到适合您的编辑部分的解决方案吗?

标签: c#


【解决方案1】:

GetValue 返回一个object 类型的对象,因为它在编译时无法知道属性的类型。 objectdefault 值是 null,但由于 DateTime 是值类型,它的 default 值不能是 null

GetValue 的结果转换为DateTime

【讨论】:

  • 好的,谢谢,但我正在对一些我不明确知道其类型的属性进行操作,因此对我来说,强制转换似乎不可行,对吧?
【解决方案2】:

如果我理解正确的话,我就是这样解决这个问题的:

    private static bool IsValueNumericDefault(object value)
    {
        var intVal = 1;
        var doubleVal = 1.0;

        return (int.TryParse($"{value}", out intVal) || double.TryParse($"{value}", out doubleVal)) && 
               (intVal == default || doubleVal == default);
    }

我通过将其转换为字符串来检查随机对象值,并尝试解析为我检查的类型。值参数由反射方法.GetValue()返回。您可以尝试将其解析为 DateTime 或您检查的任何其他类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-14
    • 1970-01-01
    • 2011-10-06
    • 1970-01-01
    相关资源
    最近更新 更多