C # Получить список классов в пространстве имен на отражение

Я хочу использовать Reflection для динамического заполнения моих флажков.

Я нашел полезный ответ здесь

И использовал его в своем коде:

    public static List<System.Type> getModuleList()
    {
        // fill with all Classes in Timestamp.View.UserControls.ModuleView per Reflection


        List<System.Type> theList = Assembly.GetExecutingAssembly().GetTypes()
                              .Where(t => t.Namespace == "Timestamp.View.UserControls.ModuleView")
                              .ToList();


        return theList;
    }

Я заполнил свои флажки следующим образом:

   foreach (System.Type type in ModuleController.getModuleList())
        {
            cbModule1.Items.Add(type);
            cbModule2.Items.Add(type);
            cbModule3.Items.Add(type);
            cbModule4.Items.Add(type);
        }
  1. Теперь я хочу создать новый экземпляр SelectedType

      private void CbModule4_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        ucModul4.Content = //new Instance of Selected Item
    }
    

Я мог бы использовать Reflection для создания нового экземпляра, но я не знаю, как это сделать.

  1. Я хочу дать каждому классу строку, которая будет отображаться как элемент в поле флажка. Возможно ли это, или мне нужен метод для поиска класса по его строке?

РЕДАКТИРОВАТЬ: мне нужно спорить, почему мой вопрос отличается от этого

Итак, во-первых, этот вопрос мог решить только одну из моих проблем, но я нашел его раньше, и это мне не помогло. Я не знаю, как получить тип списка и как дать классу псевдоним.


person itskajo    schedule 23.02.2017    source источник
comment
Не используйте рефлексию над пространствами имен, определите общий интерфейс, поскольку кажется, что все они имеют что-то общее, а затем просто получите типы, реализующие этот интерфейс. Затем вы можете заполнить те свойства, которые хотите, типизированным способом, и, предположительно, они будут иметь метку и отмеченное свойство.   -  person Icepickle    schedule 23.02.2017
comment
@Icepickle У всех них есть общий интерфейс под названием IModuleView. Но как мне получить все классы, реализующие этот интерфейс?   -  person itskajo    schedule 23.02.2017


Ответы (1)


поскольку добавление Type в поле со списком делает type.ToString() и помещает строковое представление в combobox, вы можете использовать

var instance = Activator.CreateInstance(Type.GetType(cbModule4.SelectedText))

При передаче типа вы можете:

var instance = Activator.CreateInstance(theList[0]))

person Nino    schedule 23.02.2017
comment
Я не могу переопределить type.ToString (), верно? - person itskajo; 23.02.2017
comment
вы можете сделать вспомогательный класс, такой как ComboItem, и его экземпляры в поле со списком - person Nino; 23.02.2017
comment
Хорошая идея, спасибо :) - person itskajo; 23.02.2017
comment
@itskajo Вам нужен пример? - person Nino; 23.02.2017
comment
Нет, спасибо :) Я написал об этом небольшой класс :) - person itskajo; 23.02.2017
comment
@itskajo хорошо, тогда вы можете отметить этот вопрос как решенный, а мой ответ как решение :) - person Nino; 23.02.2017