3

次のカスタム ユーザー コントロールを作成しようとしています。

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ですか?

4

1 に答える 1

9

new { vmItem }する必要がありますnew object[]{ vmItem }

現時点ではActivator.CreateInstance、パラメーターの配列ではなく、匿名型を 2 番目の引数として呼び出しています。

2番目の引数(必要なオーバーロード用)は実際にはparamsパラメーターであるため、プレーンvmItemを使用することもでき、コンパイラーは配列を生成します:

 var zr = (THeader)Activator.CreateInstance(typeof(THeader), vmItem);
于 2012-05-29T09:07:45.057 に答える