2012-05-29 2 views
2

Я пытаюсь создать пользовательский элемент управления пользователя со следующим:Как исправить активатор.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' не найден.

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

ответ

7

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

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

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

var zr = (THeader)Activator.CreateInstance(typeof(THeader), vmItem); 
+1

Вы человек, которому я обязан пиво. Это верно, спасибо. Для записи первая часть - 'new [] {vmItem}' - не работает для меня, но удаление объявления массива - '(typeof (THeader), vmItem); '- отлично работает. – DaveDev

+0

Получил немного неряшливый и оставил «объект». Я исправлю пост. – porges

Смежные вопросы