我有一个类,它有以下构造函数
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 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 应用程序中引用了组合件程序集...这不是我应该做的事情,因为我是在运行时加载它。以下代码可行:
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)});
结果是相同的。
public
(糟糕!) - Cameron