我有一个具有以下构造函数的类
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
你的代码的结果是这样的:
Leppie,你是对的,由于某种原因,我在我的 UI 应用程序中引用了 Composites 程序集...这不是我应该做的事情,因为我在运行时加载它。以下代码有效:
object composite = Activator.CreateInstance(item.CompositType,(byte)205);
var designer = Activator.CreateInstance(designerAttribute.Designer, composite);
正如你所看到的,代码不了解DelayComposite
type.
这解决了当前的问题,但为我想要实现的目标引入了许多新问题,
不管怎样,谢谢你,也谢谢所有在这里回复的人。
至于下面的代码,很多人建议:
var designer = Activator.CreateInstance(
designerAttribute.Designer,
new object[] { new DelayComposite(4) }
);
The Activator.CreateInstance
有一个如下所示的签名:
Activator.CreateInstance(Type type, params object[] obj)
所以它应该接受我的代码,但我会尝试建议的代码
UPDATE:
我已经按照建议尝试过:
var designer = Activator.CreateInstance(designerAttribute.Designer, new object[] { new DelayComposite(4)});
结果是一样的。