次のコンストラクターを持つクラスがあります
public DelayCompositeDesigner(DelayComposite CompositeObject)
{
InitializeComponent();
compositeObject = CompositeObject;
}
パラメータのないデフォルトのコンストラクタと一緒に。
次に、インスタンスを作成しようとしていますが、パラメーターなしでのみ機能します。
var designer = Activator.CreateInstance(designerAttribute.Designer);
これは問題なく機能しますが、パラメーターを渡したい場合は機能しません。
var designer = Activator.CreateInstance(designerAttribute.Designer, new DelayComposite(4));
これにより、MissingMethodException
次のようになります。
タイプVialis.LightLink.Controller.Scenarios.Composites.DelayCompositeDesignerのコンストラクターが見つかりませんでした
ここに何かアイデアはありますか?
問題は、構築中にオブジェクトを渡す必要があることです。
から継承するすべてのタイプをロードするデザイナがありますCompositeBase
。次に、これらはリストに追加され、ユーザーはそこからデザイナーにドラッグできます。そうすると、ドラッグされたインスタンスがデザイナーに追加されます。これらの各クラスには、カスタムプロパティが定義されています。
[CompositeMetaData("Delay","Sets the delay between commands",1)]
[CompositeDesigner(typeof(DelayCompositeDesigner))]
public class DelayComposite : CompositeBase
{
}
ユーザーがデザイナでアイテムを選択すると、そのタイプのデザイナをロードするためにこれらの属性が調べられます。たとえば、この場合、ユーザーがインスタンスDelayComposite
の「遅延」プロパティを設定できるようにするラベルとスライダーを持つユーザーコントロールをロードしDelayComposite
ます。
これまでのところ、コンストラクターにパラメーターを渡さなければ、これは正常に機能します。設計者はのインスタンスを作成し、DelayCompositeDesigner
それをWPFのcontentプロパティに割り当てますContentPresenter
。
ただし、そのデザイナはデザイナで選択されたプロパティを変更する必要があるため、DelayComposite
このインスタンスをデザイナに渡す必要があります。これが、コンストラクターが次のように見える理由です。
public DelayCompositeDesigner(DelayComposite CompositeObject)
{
InitializeComponent();
compositeObject = CompositeObject;
}
提案は大歓迎です
@VolkerK
コードの結果は次のとおりです。
<---- foo Vialis.LightLink.Controller.Scenarios.Composites.DelayCompositeDesignerVoid .ctor()Vialis.LightLink.Controller.Scenarios.Composites.DelayCompositeDesignerVoid .ctor(Vialis.LightLink.Controller.Scenarios.Composites.DelayComposite)param:Vialis .LightLink.Controller.Scenarios.Composites.DelayComposite foo ---->
Leppie、あなたは正しかったです。何らかの理由で、UIアプリケーションでCompositesアセンブリを参照していました...これは、実行時にロードしていたので、実行すべきことではありませんでした。次のコードが機能します。
object composite = Activator.CreateInstance(item.CompositType,(byte)205);
var designer = Activator.CreateInstance(designerAttribute.Designer, composite);
ご覧のとおり、コードにはDelayComposite
タイプの知識がありません。
これは現在の問題を解決しますが、私が達成したいことのために多くの新しい問題を紹介します。どちらにしても、ここに返信してくれたすべての人に感謝します。
次のコードについては、複数の人から提案されています。
var designer = Activator.CreateInstance(
designerAttribute.Designer,
new object[] { new DelayComposite(4) }
);
にActivator.CreateInstance
は、次のような署名があります。
Activator.CreateInstance(Type type, params object[] obj)
だからそれは私のコードを受け入れるはずですが、私は提案されたコードを試してみます
アップデート:
私は提案されたようにこれを試しました:
var designer = Activator.CreateInstance(designerAttribute.Designer, new object[] { new DelayComposite(4)});
結果は同じです。