У меня есть поле с настраиваемым атрибутом, которое выглядит так:
[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.
Если бы я указал в своем атрибуте только FieldType, я бы ожидал, что if (attribute.AllowNulls! = Null) оценит false. Вместо этого он говорит, что значение не равно нулю, и говорит, что attribute.AllowNulls имеет значение false. Таким образом, он перезаписывает мое значение по умолчанию, даже если значение не было указано. Это как-то связано с тем, что bools не допускают значения NULL? Или, возможно, если вы добавите атрибут, вы должны явно определить все параметры в нем?
Обходной путь, который я рассматриваю, - это просто сделать его строкой и bool.parsing ее, но это звучит не очень элегантно! Есть ли способ лучше?