2013-03-01 4 views
0

Здесь я застрял в болоте, так как не могу найти достаточно простой способ обнаружения унаследованных пользовательских элементов управления. В принципе, у меня есть пользовательский элемент управления «UC»,Обнаружение унаследованных пользовательских элементов управления

public partial class UC : UserControl 

, который будет работать как своего рода шаблон для общих свойств;

и некоторые наследственные пользовательские элементы управления («uc1», «UC2», «UC3», и т.д ...)

public partial class uc1 : UC 

* Цель будет список унаследованных элементов управления и бросить их в панели контейнера при в этом.

Мой вопрос: Могу ли я обнаружить/счетчик/перечислите их некоторые простой способ (без 20+ строки кода вещи) или это может быть сделано на всех?

Любые советы, оцененные.

Разработчик обучения ИК: D

ответ

1

Попробуйте что-нибудь подобное (это пересечет все существующие сборки, а не те, t уже загружен.Я также рекомендую делать что-то более элегантное, чем это, что требует большего осознания того, что вам на самом деле нужно делать. Это просто грубая сила (и это требует времени и ресурсов, поэтому запускайте это только один раз, не один раз в миллисекунду)):

var query = from assembly in AppDomain.CurrentDomain.GetAssemblies() 
      from type in assembly.GetTypes() 
      where typeof(UC).IsAssignableFrom(type) && (type != typeof(UC)) 
      let ctor = type.GetConstructor(Type.EmptyTypes) 
      where ctor != null 
      select type; 

foreach (var type in query) {     
    var control = Activator.CreateInstance(type, nonPublic: true) as UC; 
    control.Parent = thePanel; 
} 

но остерегайтесь логическим изъян здесь: Каждый класс, который расширяет класс UC будет иметь 1 экземпляр и 1 экземпляр только. Также: как вы будете динамически управлять позиционированием этих пользовательских элементов управления внутри thePanel?

+0

Я бы перетащил их –

+0

Вы создали механизм перетаскивания ** во время выполнения **? Обратите внимание, что то, что я ответил, это то, что происходит ** во время выполнения **. Во время разработки вы увидите только пустую панель в визуальном редакторе, ожидая гостей (на самом деле ожидая, что приложение начнет работать, чтобы гость мог приехать). Пожалуйста, также обратите внимание, что ваш вопрос не вызывает двусмысленности, и здравый смысл будет диктовать, что вы говорите о том, что происходит в приложении, а не в IDE ... –

+0

Механизм перетаскивания еще не сделан. Элемент управления перетаскиванием будет добавлен в UC, поэтому все унаследованные элементы управления могут иметь его. –

0

Если вы знаете, где эти элементы управления расположены (я имею в виду сборку), вы можете использовать использовать Reflection для перебора объектов и испытания для данного типа. Не уверен, что в результате код будет 20 или менее строк кода, хотя, но это единственный способ узнать ...

0

Добавить статический счетчик к базовому классу. в базовом классе общий конструктор или метод init - call counter ++. и на своем закрытом счетчике событий.

Если вы не боитесь написать еще несколько строк кода, то лучше, чем один шаблон для удерживания счетчика.

+0

Без фактического касания подклассов их статические конструкторы и инициализаторы никогда не будут исполняться (ленивая загрузка классов и джиттинг). Вот почему счетчик не будет увеличиваться правильно, так как я понимаю, что Мартинсу нужно «не делать каких-либо конкретных вещей» с подклассами ... –

+0

OP ясно говорит, что хочет выбросить их на панели при Init. Я думаю, он хочет считать экземпляры, а не типы. Тем не менее, лучший подход заключается в том, чтобы поместить код counter ++ в базовый конструктор, поэтому я отредактирую свой ответ. –

Смежные вопросы