Как исправить ошибку Activator.CreateInstance с MissingMethodException "Конструктор для типа не найден"?

Я пытаюсь создать пользовательский элемент управления со следующим:

var panel = new GenericAccordionPanel<ZoneReport, ZonesPanel, ZonesVM>(myVm.ZonesVm);

GenericAccordionPanel определяется как:

public class GenericAccordionPanel<THeader, TBody, TViewModel> : UserControl
{
    public Accordion Accordion { get; set; }

    public GenericAccordionPanel(TViewModel vmItem)
    {
        this.Accordion = new Accordion();

        //the constructor for ZoneReport(THeader) takes a ZonesVM (vmItem) as a parameter.
        var zr = (THeader)Activator.CreateInstance(typeof(THeader), new { vmItem });

        var exp = new Expander { Header = zr };

        Accordion.Children.Add(exp);

        base.Content = Accordion;
    }
}

Проблема в том, что Activator.CreateInstance терпит неудачу со следующим MissingMethodException:

Конструктор типа "[namespace].Zones.ZoneReport" не найден.

Как я могу создать ZoneReport?

1 ответ

Решение

new { vmItem } должно быть new object[]{ vmItem },

На данный момент вы звоните Activator.CreateInstance с анонимным типом в качестве второго аргумента, а не массивом параметров.

Поскольку второй аргумент (для требуемой перегрузки) на самом деле params параметр, вы также можете просто использовать обычный vmItem и компилятор сгенерирует массив:

 var zr = (THeader)Activator.CreateInstance(typeof(THeader), vmItem);
Другие вопросы по тегам