Activator.CreateInstance (...) не находит параметризованный конструктор - PullRequest
7 голосов
/ 29 февраля 2012

Учитывая следующий пример кода;

class Program
{
    static void Main(string[] args)
    {
        var results = GetChildren().ToList();
    }

    static IEnumerable<MyBaseClass> GetChildren()
    {
        return Assembly.GetExecutingAssembly()
            .GetTypes()
            .Where(t => t.BaseType == typeof(MyBaseClass))
            .Select(o => (MyBaseClass)Activator.CreateInstance(o, null));
    }
}

abstract class MyBaseClass
{ }

class MyChildClass : MyBaseClass
{
    public MyChildClass(object paramOne)
    {

    }
}

Я получаю следующую ошибку:

MissingMethodException: Конструктор типа 'CreateInstanceCtorIssue.MyChildClass'не найдено.

Однако, если я добавляю конструктор без параметров, он создает объекты ОК.

Я пытаюсь понять, почему параметр, к которому я добавляю CreateInstance, не приводит к тому, что он находит правильный конструктор.У кого-нибудь есть идеи?

Ответы [ 2 ]

10 голосов
/ 29 февраля 2012

По сути, вторым аргументом метода , который вы вызываете , является params array .Происходит то, что компилятор C # обрабатывает ваш вызов метода так, как если бы вы передавали этот аргумент, используя «нерасширенную» форму, то есть передавая null ссылку на массив.С другой стороны, ваша цель - использовать «расширенную» форму, то есть передать ссылку на массив, содержащий одну нулевую ссылку.

Вы можете уговорить компилятор сделать то, что вы хотите, вот так:

// Unexpanded:
Activator.CreateInstance(o, new object[] { null })

// Expanded explictly:
Activator.CreateInstance(o, (object) null )
3 голосов
/ 29 февраля 2012

Вы должны передать параметры конструктора:

.Select(o => (MyBaseClass)Activator.CreateInstance(o, new object[] { someParam }));

MyChildClass ожидает один параметр типа объекта для своего конструктора - вы должны передать этот параметр в массиве.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...