c # пользовательский атрибут - отсутствуют логические параметры по умолчанию false? - PullRequest
0 голосов
/ 13 июня 2011

У меня есть поле с пользовательским атрибутом, которое выглядит так:

[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, но это звучит не очень элегантно! Есть ли лучший способ?

Ответы [ 2 ]

2 голосов
/ 13 июня 2011

Вам нужно третье состояние, отличное от true или false, и оно будет неустановленным.

Измените AllowNulls на Nullable boolean , bool ?. AllowNulls будет разрешать значения null, true или false. Если пользователь не указывает его в атрибуте, он будет инициализирован нулем. Таким образом, ваш attribute.AllowNulls != null будет делать именно то, что вы хотите, и пользователи по-прежнему смогут установить значение true или false.

Хорошо, значит, вы не можете использовать обнуляемые атрибуты. Не знал этого. Вы можете использовать что-то вроде ниже, а не переходить на строку, хотя это не так красиво:

 private bool? allowNulls = null;
 public bool AllowNulls  {
    get { return allowNulls.GetValueOrDefault(false); }
    set { allowNulls = value; }
 }
 public bool AllowNullsWasSet() { return allowNulls.HasValue; }
1 голос
/ 13 июня 2011

Если я неправильно понимаю ваш вопрос, он всегда будет ложным, если вы не инициализируете его иначе.Поскольку bool является значением, по умолчанию используется значение false.Так что без инициализации так и останется.Кроме того, attribute.AllowNulls! = Null не должен компилироваться, поскольку тип значения никогда не может быть нулевым.Null зарезервирован для ссылочных типов, поскольку он сравнивает саму ссылку для проверки.

...