Я создаю пользовательский веб-элемент управления с общедоступным свойством, которое я хочу получить только во время разработки (т.е. сделать его недоступным в коде).
Атрибут 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. Установка значения в код за работает. В этом отношении поведение похоже на то, что атрибут никогда не был установлен. И я очистил и восстановил полное решение. Дважды.
Я делаю это неправильно? Можете ли вы, пожалуйста, сказать мне, что это за правильный способ? "
Большое спасибо заранее.
Атрибут DesignOnly promises делает только это
Собственно, нет; он пытается понять, когда доступ к нему в коде не доступен; если вы лжете (т.е. утверждаете, что что-то имеет дизайн - только тогда, когда оно доступно), тогда вы должны ожидать, что он будет плохо себя вести. Компилятор знает, что доступно, и этот атрибут только для дизайна не определен в спецификации С#, поэтому он не имеет никакого значения для компилятора, если вы добавляете этот атрибут.
Попробуйте добавить:
[EditorBrowsable(EditorBrowsableState.Never)]
на который смотрит редактор кода (IDE) (но только при использовании отдельной сборки) - обратите внимание, что это не мешает вам его использовать - он просто скрывает его.
Я считаю, что текст MSDN пытается описать разницу между свойствами, которые действительно существуют в коде, vs свойства, которые только притворяются существующими; вы можете на самом деле делать всевозможные вещи, чтобы создавать ложные свойства в дизайнере, и именно эти притворные свойства могут быть отмечены как только для дизайна.
[Browsable(false)]
; и вы можете создать настоящие свойства только для дизайнера, используя пользовательскую модель свойств, но это сложная тема, включающая пониманиеTypeDescriptor
,PropertyDescriptor
,ICustomTypeDescriptor
,TypeConverter
и т. д. - очень сложная.