Как реализовать INamingContainer, расскажите мне что-нибудь глубже

Если я хочу реализовать пользовательский контейнерный элемент управления, я должен сохранить свой элемент управления, наследуемый от INamingContainer. Это интерфейс был определен как интерфейс маркера. Как я знаю, это сделает CLR, создающий оператор управления, в виде метаданных, подобного атрибуту.

Итак, я хочу знать:

  1. Система фреймворка.net только создала метаданные для своего интерфейса маркера? Могу ли я создать интерфейс маркера?

  2. Что произойдет, когда компилятор CLR компилирует элемент управления, наследуемый от INamingContainer?

  3. Какова функция INamingContainer для управления контейнером?

заранее спасибо!

1 ответ

Любой элемент управления, реализующий этот интерфейс, создает новое пространство имен, в котором все атрибуты идентификатора дочернего элемента управления гарантированно будут уникальными.

Идентификаторы устанавливаются механизмом asp.net, который определяет, есть ли у элемента управления этот атрибут, когда он строит иерархию элементов управления. Когда он встречает дочерний элемент управления с этим атрибутом, он меняет способ создания идентификаторов для дочерних элементов этого дочернего элемента управления, чтобы они все были уникальными.

Интерфейс называется "маркер", потому что он не имеет методов / свойств. Он действительно используется в качестве маркера в вашем классе движком asp.net.

Пример метода, который получает все классы, реализующие определенный атрибут (по этой ссылке)

static IEnumerable<Type> GetTypesWithHelpAttribute(Assembly assembly) {
    foreach(Type type in assembly.GetTypes()) {
        if (type.GetCustomAttributes(typeof(HelpAttribute), true).Length > 0) {
            yield return type;
        }
    }
}
Другие вопросы по тегам