Предположим, что по какой-то причине я хочу создать пользовательский элемент управления, производный от Control, а не от WebControl. Давайте также предположим, что мне нужно обработать атрибуты (т.е. реализовать IAttributeAccessor) и что я хочу сделать это, используя AttributeCollection, как это делает WebControl.
WebControl реализует свойство Attributes следующим образом:
public AttributeCollection Attributes
{
get
{
if (this.attrColl == null)
{
if (this.attrState == null)
{
this.attrState = new StateBag(true);
if (base.IsTrackingViewState])
{
this.attrState.TrackViewState();
}
}
this.attrColl = new AttributeCollection(this.attrState);
}
return this.attrColl;
}
}
Обратите внимание на следующее:
- Вы не можете создать коллекцию AttributeCollection, не присвоив ей StateBag.
- Мы должны создать новый StateBag. Не следует повторно использовать элементы управления StateBag, поскольку атрибут может иметь имя в качестве значения, сохраненного элементом управления.
- Мы не можем вызвать TrackViewState для StateBag, потому что это внутренний метод.
- StateBag - это запечатанный класс.
Итак, насколько я понимаю, если я хочу использовать коллекцию AttributeCollection, мне нужно использовать новый StateBag, который никогда (без использования трюков, таких как отражение) не сможет правильно управлять состоянием.
Я что-то упустил?