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