【问题标题】:c# custom attribute- missing boolean parameters default to false?c#自定义属性-缺少布尔参数默认为false?
【发布时间】:2011-06-13 01:35:00
【问题描述】:

我有一个带有自定义属性的字段,如下所示:

[DBDataTypeAttribute(FieldType = "varchar(1000)",AllowNulls=false)]
public String ERLineID;

我有一些寻找这个的代码,像这样:

foreach (FieldInfo field in userType.GetFields())
{
    currentDefaultDataType = createtabledefaultdatatype;
    currentDefaultAllowNulls = createtabledefaultallownulls;

    DBDataTypeAttribute attribute =
        (DBDataTypeAttribute)Attribute.GetCustomAttribute(field, typeof(DBDataTypeAttribute));

    if (attribute != null)
    {
        // at least one of createtabledefaultdatatype or createtabledefaultallownulls exists
        if (attribute.FieldType != null)
        {
            currentDefaultDataType = attribute.FieldType;
        }
        if (attribute.AllowNulls != null)
        {
            currentDefaultAllowNulls = attribute.AllowNulls;
        }
...

值 createtabledefaultallownulls 来自配置文件并设置为 true。但是我发现,当我在属性中去掉“allownulls”时,它会用 false 值覆盖我的“true”默认值。

如果我在属性中仅指定 FieldType,我会期望 'if (attribute.AllowNulls != null)' 评估为 false。相反,它说该值不为空,并说 attribute.AllowNulls 为假。因此,即使未指定任何值,它也会覆盖我的默认值。这与布尔不可为空有关吗?或者,如果您添加一个属性,您必须明确定义其中的所有参数?

我正在考虑的解决方法只是将其设为字符串并对其进行 bool.parsing,但这听起来不太优雅!有没有更好的办法?

【问题讨论】:

    标签: c# custom-attributes


    【解决方案1】:

    您需要除 true 或 false 之外的第三种状态,这将是未设置的。

    将 AllowNulls 更改为 Nullable boolean, bool?。然后 AllowNulls 将允许 null、true 或 false 的值。如果用户没有在属性中指定它,它将被初始化为 null。因此,您的 attribute.AllowNulls != null 将完全按照您的意愿行事,用户仍然可以将值设置为 truefalse

    好的,所以您不能在属性上使用可空值。不知道那个。你可以使用类似下面的东西而不是转换成一个字符串,虽然它不是那么漂亮:

     private bool? allowNulls = null;
     public bool AllowNulls  {
        get { return allowNulls.GetValueOrDefault(false); }
        set { allowNulls = value; }
     }
     public bool AllowNullsWasSet() { return allowNulls.HasValue; }
    

    【讨论】:

    • 谢谢。这是我最初认为好的,但是当我将属性的私有/公共部分更改为 bool 时?我收到错误“错误 4 'AllowNulls' 不是有效的命名属性参数,因为它不是有效的属性参数类型”。这是属性声明:private bool?允许空值;公共布尔? AllowNulls { 获取...
    • 你说得对,属性上不允许有空值。没有意识到这一点。见stackoverflow.com/questions/1416126/…
    • 有趣的选择,谢谢。我将其标记为答案,因为它提供了替代代码来实现所需的目的。就我而言,我会选择一个我认为的字符串! :)
    【解决方案2】:

    除非我误解了您的问题,否则除非您以其他方式对其进行初始化,否则它将始终是错误的。由于 bool 是一个值,它的默认值为 false。因此,如果没有初始化,它将保持这种状态。此外,attribute.AllowNulls != null 不应编译,因为值类型永远不能为 null。 Null 是为引用类型保留的,因为它是引用本身进行比较以进行检查。

    【讨论】:

    • 嗨 hvie,基本上我的 if 语句试图查看属性是否具有为该字段指定的 'allownulls' 值。鉴于您所提到的,有没有办法确定布尔值是否存在真正的“用户指定”值? attribute.AllowNulls != null 确实可以编译,但正如您所说,它没有执行功能。
    • 我想你提到你已经从配置中加载了这个,所以你可以把它变成一个字符串。
    • 我认为你必须抽象它,然后使用属性的构造函数来设置它。然后你可以有另一个位显示它是否已设置。除非您使用可为空的 bool (bool?),否则它很麻烦
    • 也许不清楚,我会在属性上创建一个属性,以便在设置它时,您还可以设置一点显示该值已设置,而不仅仅是默认值。这将为您提供您正在寻找的三种状态(未设置、假、真)
    • 谢谢。我同意可以为空的布尔值将是一种优雅的方式,不幸的是这会产生错误;也许可以为空的布尔值不允许作为属性的参数。
    猜你喜欢
    • 1970-01-01
    • 2016-03-19
    • 1970-01-01
    • 2012-10-03
    • 1970-01-01
    • 2021-09-20
    • 2015-01-11
    • 2015-03-04
    • 1970-01-01
    相关资源
    最近更新 更多