Получить список элементов управления для каждой веб-формы в сборке

Можно ли получить простой текстовый список элементов управления, присутствующих в веб-форме, с помощью отражения? Обычно коллега хочет получить список элементов управления, которые помогут определить стратегию проверки, например. Обычно номера продуктов должны быть числовыми, но на некоторых экранах они могут быть буквенно-цифровыми. Я думал, что с помощью отражения будет просто сгенерировать список чего-то вроде:

AddProduct.aspx
     txtProductNumber
     txtProductName
     etc.

Я могу получить имена форм, но пока не элементы управления, содержащиеся в них. Текущий код выглядит так:

Assembly assembly = Assembly.LoadFrom(@"Filename.dll");
Type[] types = assembly.GetExportedTypes();
for (int i = 0; i < types.Length; i++)
{
    Page page = (Page)assembly.CreateInstance(types[i].FullName);
    ControlCollection controls = page.Controls;
    // At this point controls.Count = 0 presumably because the controls are defined as protected.
}


Assembly.CreateInstance содержит несколько перегрузок. Например, если я изменю строку назначения страницы на

Страница page = (Страница) assembly.CreateInstance (types [i] .FullName, true, BindingFlags.NonPublic, null, null, null, null);

то я получаю сообщение об отсутствии конструктора.

Итак, я пошел полностью по неправильному пути или то, что я пытаюсь сделать, вообще возможно? Любая помощь очень ценится.

Изменить: приносим свои извинения за задержку с ответом на этот вопрос. Мы немного пошли дальше, используя Assembly.GetCallingAssembly () для создания списка, но он все еще не совсем соответствовал нашим потребностям. В конце концов, мы использовали более длинный подход к решению «Найти во всем».


person Malice    schedule 12.08.2011    source источник


Ответы (1)


Мне кажется, что вы ищете элементы управления, которые создаются во время выполнения. Если вы хотите найти эти элементы управления во время выполнения, вы можете использовать как отражение, так и (в зависимости от контейнера) другие средства. Вы должны сделать это в событии Page_Unload, в которое большинство элементов управления будет загружено и по-прежнему доступно.

Но если вы пытаетесь найти эти элементы управления, не обрабатывая свои страницы в течение жизненного цикла запроса страницы, это может быть пугающим. Простое создание страницы с CreateInstance (или «новой») в этом отношении не будет запускать Page_Load, Page_Init или какие-либо другие события. Он только запускает код в конструкторе (который, как вы выяснили, защищен, что не означает, что вы не можете создать его экземпляр, но решение этой проблемы мало что вам даст).

person Abel    schedule 12.08.2011