我有一个具有以下构造函数的类
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) 参数: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)});
结果是一样的。