c#custom属性 - 缺少布尔参数默认为false?

时间:2011-06-13 01:35:00

标签: c# custom-attributes

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

[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。相反,它表示该值不为null并且表示attribute.AllowNulls为false。所以即使没有指定值,它也会覆盖我的默认值。这与bools不可为空有关吗?或者,如果你添加一个属性,你必须明确定义其中的所有参数吗?

我正在考虑的解决方法就是将它变成一个字符串并bool.parsing它,但这听起来不是很优雅!还有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

你需要第三个非虚假的状态,这将是未设置的。

将AllowNulls更改为Nullable boolean,bool?。然后AllowNulls将允许null,true或false的值。如果用户未在属性中指定它,则将其初始化为null。因此,您的attribute.AllowNulls != null将完全符合您的要求,用户仍然可以将值设置为truefalse

好的,所以你不能在属性上使用nullables。不知道那个。您可以使用类似下面的内容而不是切换到字符串,尽管它不是那么漂亮:

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

答案 1 :(得分:1)

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