【问题标题】:Getting the default of an unknown type at runtime [duplicate]在运行时获取未知类型的默认值[重复]
【发布时间】:2013-01-27 00:24:35
【问题描述】:

我正在使用反射来获取对象的所有属性。然后,我需要查看这些属性中的任何一个值是否是它们恰好是任何类型的默认值。以下是我当前的代码。它抱怨找不到命名空间或类型。这让我相信它与 c# 如何进行隐式类型强制有关。由于我在运行时获取类型,因此它不知道如何比较它或对此并不十分清楚。

我希望避免在输入类型的名称上进行 switch case 比较,但现在这看起来是我唯一的选择,除非 StackOverflow 上的杰出人士能够引导我朝着正确的方向前进。

 private bool testPropertyAttribute(PropertyInfo prop)
    {
        dynamic value = prop.GetValue(DataObject, null);
        Type type = prop.PropertyType;

        /* Test to see if the value is the defult of its type */
        return (value == default(prop.PropertyType) 

    }

【问题讨论】:

  • default only works with generic parameters. 另外,您的代码缺少右括号和分号。
  • 我假设您希望非值类型默认为 null?
  • 你应该避免dynamic,除非你没有其他好的选择。使用varobject 作为value 的类型在这里可以很好地工作。
  • 你的意思是结束parenthesis )
  • 很好,谢谢,这是重复的,在我的研究中没有看到。从来没有想过这样做。

标签: c# reflection types type-conversion type-coercion


【解决方案1】:

== for object 总是意味着:引用相等。作为参考,默认总是null,所以如果!prop.PropertyType.IsValueType,那么你只需要一个null检查。对于值类型,您将进行拳击。所以引用相等总是会报告 false,除非它们对于某些 T 都是 Nullable<T>,并且都是空的。但是,要获得“默认”值类型 (prop.PropertyType.IsValueType),您可以使用 Activator.CreateInstance(prop.PropertyType)。请记住,==不会在这里做你想做的事。 Equals(x,y) 可能会更好。

【讨论】:

  • 谢谢。我总是忘记 == 是一个引用相等。也许这是最后一次了。
【解决方案2】:

您可以做到这一点,但不能依赖 == 运算符来完成这项工作。您需要使用 .Equals 或 object.ReferenceEquals 进行比较。

【讨论】:

    猜你喜欢
    • 2011-01-30
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    • 2011-03-01
    • 2011-02-22
    • 1970-01-01
    相关资源
    最近更新 更多