当前位置: 首页 > 编程语言 > C#

Activator.CreateInstance找不到构造函数(MissingMethodException)分享

时间:2023-04-11 00:37:41 C#

Activator.CreateInstance找不到构造函数(MissingMethodException)复合对象=复合对象;}和一个没有参数的默认构造函数。接下来我尝试创建一个实例,但它只能在没有参数的情况下工作:vardesigner=Activator.CreateInstance(designerAttribute.Designer);这工作正常,但如果我想传递参数,它不会:vardesigner=Activator.CreateInstance(designerAttribute.Designer,newDelayComposite(4));这导致MissingMethodException:没有找到Vialis.LightLink.Controller.Scenarios.Composites.DelayCompositeDesigner类型的构造函数这里有什么想法吗?问题是我真的需要在构造过程中传递一个对象。你看我有一个设计器,它从CompositeBaseinheritance加载所有类型。然后将它们添加到一个列表中,用户可以从中将它们拖到设计器中。这样做之后,将拖动的实例添加到设计器中。这些类中的每一个都定义自定义属性:[CompositeMetaData("Delay","Setsthedelaybetweencommands",1)][CompositeDesigner(typeof(DelayCompositeDesigner))]publicclassDelayComposite:CompositeBase{}当用户选择一个项目时在设计器中,它查看这些属性以加载该类型的设计器。例如,对于DelayComposite,它将加载一个用户控件,该控件具有一个标签和一个滑块,允许用户设置DelayComposite实例的“Delay”属性。到目前为止,如果我不向构造函数传递任何参数,这就可以正常工作。设计器创建DelayCompositeDesigner的实例并将其分配给WPFContentPresenter的内容属性。但是由于这个设计器需要修改设计器中选择的DelayComposite的属性,所以我不得不将这个实例传递给它。这就是构造函数看起来像这样的原因:publicDelayCompositeDesigner(DelayCompositeCompositeObject){InitializeComponent();复合对象=复合对象;欢迎提出建议@VolkerK你的代码的结果是这样的:Leppie,你是对的,我的动机是不知何故在我的UI应用程序中引用了Composites程序集......这不是我应该做的在运行时加载它。以下代码有效:objectcomposite=Activator.CreateInstance(item.CompositType,(byte)205);vardesigner=Activator.CreateInstance(designerAttribute.Designer,composite);如您所见,代码不理解DelayComposite类型。这解决了当前的问题,但为我要实现的目标引入了很多新问题,无论哪种方式,谢谢你,并感谢所有在这里回应的人。至于下面的代码,多人推荐:vardesigner=Activator.CreateInstance(designerAttribute.Designer,newobject[]{newDelayComposite(4)});Activator.CreateInstance有一个看起来像这样的签名:Activator.CreateInstance(Typetype,paramsobject[]obj)所以它应该接受我的代码,但我会尝试建议的代码更新:我按照建议尝试了这个:vardesigner=Activator.CreateInstance(designerAttribute.Designer,newobject[]{newDelayComposite(4)});结果是一样的。我认为您正在处理类型不匹配的问题。这些程序集可能在不同的地方被引用,或者它们是针对不同的版本编译的。我建议您遍历ConstructorInfo并在适当的参数上执行paramtype==typeof(DelayComposite)。我认为您的电话需要是:vardesigner=Activator.CreateInstance(designerAttribute.Designer,newobject[]{newDelayComposite(4)});当然,除非在这种情况下答案不是显而易见的。虽然我讨厌类似printf的调试...publicstaticvoidfoo(Typet,paramsobject[]p){System.Diagnostics.Debug.WriteLine("");}//...foo(designerAttribute.Designer,newDelayComposite(4));vardesigner=Activator.CreateInstance(designerAttribute.Designer,newDelayComposite(4));visualstudio的输出窗口打印的是什么?如果你想调用这个构造函数...publicDelayCompositeDesigner(DelayCompositeCompositeObject)...只需使用这个:vardesigner=Activator.CreateInstance(typeof(DelayCompositeDesigner),newDelayComposite(4));或vardesigner=Activator.CreateInstance(newDelayComposite(4));我有一个类似的问题,但我的问题是由于构造函数的可见性。这个堆栈溢出帮助了我:使用反射在内部类中实例化带有参数的构造函数我找到了另一种创建对象实例的方法,而不是在回答SF上的另一个问题时根本不调用构造函数。在System.Runtime.Serialization命名空间中,有一个函数FormatterServices.GetUninitializedObject(type)将在不调用构造函数的情况下创建对象。如果您查看Reflector中的函数,您会发现它正在进行外部调用。我不知道幕后黑魔法到底是如何发生的。但是我确实向自己证明了从未调用构造函数,而是实例化了对象。您可以在CreateInstance上使用以下重载:publicstaticObjectCreateInstance(Typetype,Object[]args)在您的情况下(我认为):vardesigner=Activator.CreateInstance(typeof(DelayCompositeDesigner),newobject[]{newDelayComposite(4)});我找到了解决问题的方法,我正在为同样的问题而苦苦挣扎。这是我的激活器:privatevoidLoadTask(FileInfodll){Assemblyassembly=Assembly.LoadFrom(dll.FullName);foreach(Typetypeinassembly.GetTypes()){varhasInterface=type.GetInterface("ITask")!=null;如果(type.IsClass&&hasInterface){varinstance=Activator.CreateInstance(type,_proxy,_context);_tasks.Add(type.Name,(ITask)instance);这是我的类激活器,请注意我必须将构造函数参数更改为对象,这是我让它工作的唯一方法。publicclassCalculateDowntimeTask:Task{publicCalculateDowntimeTask(对象代理,对象上下文):base((TaskServiceClient)proxy,(TaskDataDataContext)context){}publicoverridevoidExecute(){LogMessage(newTaskMessage(){Message="Testing"});BroadcastMessage(newTaskMessage(){Message="Testing"});当我遇到这个问题时,我正在使用一个方法插入Activator.CreateInstance,该方法返回一个参数列表,该列表的参数数量与我尝试创建的参数数量相同。对象的构造函数不同。以上就是C#学习教程:Activator.CreateInstance找不到构造函数(MissingMethodException)分享的全部内容。如果对你有用,需要了解更多C#学习教程,希望大家多多关注——本文来自网络收集,不代表侵权,请点击右边联系管理员删除。如需转载请注明出处: