我有一个带有自定义属性的字段,如下所示:
[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它,但这听起来不是很优雅!还有更好的方法吗?
答案 0 :(得分:2)
你需要第三个非虚假的状态,这将是未设置的。
将AllowNulls更改为Nullable boolean,bool?。然后AllowNulls将允许null,true或false的值。如果用户未在属性中指定它,则将其初始化为null。因此,您的 attribute.AllowNulls != null
将完全符合您的要求,用户仍然可以将值设置为true
或false
。
好的,所以你不能在属性上使用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是为引用类型保留的,因为它是它的检查比较的引用本身。