Атрибут DesignOnly не скрывает свойство во время выполнения

2

Я создаю пользовательский веб-элемент управления с общедоступным свойством, которое я хочу получить только во время разработки (т.е. сделать его недоступным в коде). Атрибут DesignOnly promises делает именно это, но когда я устанавливаю [DesignOnly(true)], он не имеет никакого заметного эффекта:

[Bindable(true)]
[Category("Appearance")]
[DefaultValue(null)]
[Localizable(false)]
[DesignOnly(true)]
public string MyProp
{
    get
    {
        return ViewState["MyProp"] as string;
    }


    set
    {
        ViewState["MyProp"] = value;
    }
}

Свойство еще появляется в коде за IntelliSense. Установка значения в код за работает. В этом отношении поведение похоже на то, что атрибут никогда не был установлен. И я очистил и восстановил полное решение. Дважды.

Я делаю это неправильно? Можете ли вы, пожалуйста, сказать мне, что это за правильный способ? "

Большое спасибо заранее.

Теги:
custom-controls

1 ответ

2
Лучший ответ

Атрибут DesignOnly promises делает только это

Собственно, нет; он пытается понять, когда доступ к нему в коде не доступен; если вы лжете (т.е. утверждаете, что что-то имеет дизайн - только тогда, когда оно доступно), тогда вы должны ожидать, что он будет плохо себя вести. Компилятор знает, что доступно, и этот атрибут только для дизайна не определен в спецификации С#, поэтому он не имеет никакого значения для компилятора, если вы добавляете этот атрибут.

Попробуйте добавить:

[EditorBrowsable(EditorBrowsableState.Never)]

на который смотрит редактор кода (IDE) (но только при использовании отдельной сборки) - обратите внимание, что это не мешает вам его использовать - он просто скрывает его.

Я считаю, что текст MSDN пытается описать разницу между свойствами, которые действительно существуют в коде, vs свойства, которые только притворяются существующими; вы можете на самом деле делать всевозможные вещи, чтобы создавать ложные свойства в дизайнере, и именно эти притворные свойства могут быть отмечены как только для дизайна.

  • 0
    Спасибо! Это было поучительно. Итак, я понимаю, что нет способа контролировать фактическую доступность свойства способом, который зависит от текущего режима (дизайн / время выполнения)?
  • 1
    Вы можете сделать свойства кода недоступными для большинства дизайнеров, используя такие вещи, как [Browsable(false)] ; и вы можете создать настоящие свойства только для дизайнера, используя пользовательскую модель свойств, но это сложная тема, включающая понимание TypeDescriptor , PropertyDescriptor , ICustomTypeDescriptor , TypeConverter и т. д. - очень сложная.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню