Reflection - Не удаётся получить указанный тип - C#

218
29 марта 2018, 05:48

У меня есть метод создания формы и пользовательского элемента управления:

public static void Add(Form it, string title, string type, string content, string mode)
{
    string fullname = Assembly.GetExecutingAssembly().GetName().Name + "." + type;
    Type className = Type.GetType(fullname, false, true);
    var formObject = Activator.CreateInstance(className) as Form;
    string contentFullname = Assembly.GetExecutingAssembly().GetName().Name + ".Data.content." + content;
    Type contentName = Type.GetType(contentFullname, false, true);
    var contentObject = Activator.CreateInstance(contentName) as UserControl;
    if (formObject != null)
    {
        if (mode == "Show")
        {
            it.Hide();
            formObject.Text = title;
            formObject.Controls.Add(contentObject);
            formObject.Show();
        } 
        else if (mode == "Dialog")
        {
            formObject.Text = title;
            formObject.Controls.Add(contentObject);
            formObject.ShowDialog();
        }
    }
}

Я инициализирую метод:

Function.Add(Controls.Owner.FindForm(), "Заголовок", "Form_default", "UserControl_main", "Show");

При отладки появляется ошибка:

"Значение не может быть неопределенным.\r\nИмя параметра: type"

В строке:

var formObject = Activator.CreateInstance(className) as Form;

При отладки, нижеперечисленные переменные имеют значения null.

Type classname
var formObject

То есть GetType не может найти нужный мне тип. Но дело в том, что этот метод работал в другом проекте, хотя отличия в проектах нулевые. P.S. ...Проект новый создал из-за сломанной БД и бесконечных ошибок из-за неё. Так же нижепредставленный код подсвечивается с надписью: Представляет окно или диалоговое окно, которое составляет пользовательский интерфейс приложения. Используйте сопоставление шаблонов. IDE0019 - Сопоставление шаблонов

var formObject

Помогите решить проблему.

Answer 1

Проблема была в том, что классы наподобие Form_default находились в неправильном пространстве имён (из-за переноса из другого проекта). Из-за этого определение пространства имён через Assembly.GetExecutingAssembly().GetName().Name не работало.

Это приводило к тому, что тип не находился, и className равнялось null, что и было причиной дальнейших ошибок.

READ ALSO
Добавить код в работающее приложение

Добавить код в работающее приложение

Нужно иметь возможность добавить в работающую программу небольшой код, который будет сохранён как функция, и который можно будет в дальнейшем...

214
Вытащить нужные данные из строки C#

Вытащить нужные данные из строки C#

Есть два текстбокса, в которые мы вводим текст и по нажатию кнопки данные из текстбоксов передаются в две переменныеТо есть, textBox1 и textBox2, нажимаем...

426
как вывести на консоль общее количество итераций? c# [требует правки]

как вывести на консоль общее количество итераций? c# [требует правки]

Напримерперебираются в цикле for числа,от одного до "КАКОГО ТО РАНДОМНОГО ЧИСЛА"

180
Программное связывание view и viewmodel

Программное связывание view и viewmodel

Как организовать (при нажатии определённого пункта меню) погрузку view и соответствующих им viewmodel во frame? В проекте используется wpf, стараюсь...

183