MissingMethodException при создании объекта с отражением

Я использую отражение для создания объектов из внешней сборки. Моя проблема в том, что я не могу создать объект таким образом:

Type t = assembly.GetType("ExternalClass");
object obj = Activator.CreateInstance(t, new object[] { data, Type.Missing, Type.Missing });

Я получаю System.MissingMethodException: Additional information: Constructor on type 'ExternalClass' not found. Однако таким образом все работает нормально:

Type t = assembly.GetType("ExternalClass");
ConstructorInfo[] constructors = t.GetConstructors();
object obj = constructors[0].Invoke(new object[] { data, Type.Missing, Type.Missing });

ExternalClass имеет только 1 конструктор с 2 необязательными параметрами, и я уверен, что передаю правильные аргументы, потому что второй способ создает нужный мне объект. Я что-то пропустил в первом подходе? Я бы предпочел первый, потому что он легче читается

РЕДАКТИРОВАТЬ: я забыл о CultureInfo (зачем он нужен этому методу?!). Решение заключается в использовании:

object obj = Activator.CreateInstance(t,
    BindingFlags.CreateInstance |
    BindingFlags.Public |
    BindingFlags.Instance |
    BindingFlags.OptionalParamBinding, null, new object[] { data, Type.Missing, Type.Missing }, CultureInfo.CurrentCulture);

person YogoWafel    schedule 17.02.2018    source источник
comment
Предоставляет ли ваш ExternalClass публичный ctor, кажется, нет?   -  person Johnny    schedule 17.02.2018
comment
constructors[0].IsPublic дает мне Правда, это действительно так   -  person YogoWafel    schedule 17.02.2018
comment
Как мне вызвать CreateInstance с помощью BindingFlags.OptionalParamBinding? Может быть, это проблема   -  person YogoWafel    schedule 17.02.2018


Ответы (2)


Вот как вы должны построить конструктор с Activator

(T)Activator.CreateInstance(typeof(T), 
    BindingFlags.CreateInstance |
    BindingFlags.Public |
    BindingFlags.Instance |
    BindingFlags.OptionalParamBinding, null, new object[] { data, Type.Missing, Type.Missing }, CultureInfo.CurrentCulture);
person Johnny    schedule 17.02.2018
comment
Здорово! Это сработало, спасибо! Кстати, мне все еще интересно, зачем CreateInstance понадобился CultureInfo... - person YogoWafel; 17.02.2018
comment
Хороший вопрос может быть следующим вопросом о stackoverflow, которого до сих пор не существует, я не смог найти реального использования... - person Johnny; 17.02.2018

Это можно сделать, добавив соответствующие флаги флаги привязки, например:

(T)Activator.CreateInstance(typeof(T), 
                BindingFlags.CreateInstance |
                BindingFlags.Public |
                BindingFlags.Instance | 
                BindingFlags.OptionalParamBinding,
                null,
                new object[] {data, Type.Missing, Type.Missing },
                CultureInfo.CurrentCulture);
person Lennart Stoop    schedule 17.02.2018
comment
нет, я все еще получаю Constructor on type 'ExternalClass' not found. с таким подходом - person YogoWafel; 17.02.2018
comment
Странно то, что, несмотря на копирование вашего кода, Visual Studio дает мне предыдущую подсказку по перегрузке, когда я навожу курсор на метод - почему я не вижу BindingGlags в его параметрах? ссылка - person YogoWafel; 17.02.2018
comment
Да, я просто смотрел на перегрузки, это тоже требует культуры, я отредактирую фрагмент - person Lennart Stoop; 17.02.2018