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

我有一个具有以下构造函数的类

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

这里有什么想法?


问题是我真的需要在施工期间传递一个物体。

你看我有一个设计器加载从CompositeBaseinheritance的所有类型。 然后将这些添加到列表中,用户可以从中将它们拖动到设计器。 执行此操作后,将拖动的实例添加到设计器中。 这些类中的每一个都定义了自定义属性:

 [CompositeMetaData("Delay","Sets the delay between commands",1)] [CompositeDesigner(typeof(DelayCompositeDesigner))] public class DelayComposite : CompositeBase { } 

当用户选择设计器中的项目时,它会查看这些属性以便为该类型加载设计器。 例如,在DelayComposite的情况下,它将加载一个用户控件,该控件具有一个标签和一个滑块,允许用户设置DelayComposite实例的“Delay”属性。

到目前为止,如果我没有将任何参数传递给构造函数,这可以正常工作。 设计器创建DelayCompositeDesigner的实例,并将其分配给WPF ContentPresenter的content属性。

但由于该设计人员需要在设计器中修改所选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类型。

这解决了当前的问题,但为我想要实现的目标引入了许多新的问题,无论是哪种方式都感谢你,并感谢所有在这里回复的人。


至于以下代码,由多人建议:

 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)}); 

结果是一样的。

我认为你正在处理类型不匹配。

可能在不同的地方引用程序集,或者它们是针对不同的版本编译的。

我建议你遍历ConstructorInfo并在适当的参数上做一个paramtype == typeof(DelayComposite)

我认为你的电话需要是:

 var designer = Activator.CreateInstance(designerAttribute.Designer, new object[] { new DelayComposite(4) }); 

当然,除非这样,在这种情况下,答案并不是立即显而易见的。

虽然我讨厌类似printf的调试……

 public static void foo(Type t, params object[] p) { System.Diagnostics.Debug.WriteLine("<---- foo"); foreach(System.Reflection.ConstructorInfo ci in t.GetConstructors()) { System.Diagnostics.Debug.WriteLine(t.FullName + ci.ToString()); } foreach (object o in p) { System.Diagnostics.Debug.WriteLine("param:" + o.GetType().FullName); } System.Diagnostics.Debug.WriteLine("foo ---->"); } // ... foo(designerAttribute.Designer, new DelayComposite(4)); var designer = Activator.CreateInstance(designerAttribute.Designer, new DelayComposite(4)); 

在visual studio的输出窗口中打印了什么?

如果你想调用这个构造函数……

 public DelayCompositeDesigner(DelayComposite CompositeObject) 

……只是用这个:

 var designer = Activator.CreateInstance(typeof(DelayCompositeDesigner), new DelayComposite(4)); 

要么

 var designer = Activator.CreateInstance(new DelayComposite(4)); 

我有一个类似的问题,但我的问题是由于构造函数的可见性。 这个堆栈溢出帮助我:

使用reflection在内部类中使用参数实例化构造函数

我发现另一种创建对象实例的方法,而不是在回答 SF上的另一个问题时根本不调用构造函数。

System.Runtime.Serialization命名空间中,有一个函数FormatterServices.GetUninitializedObject(type) ,它将在不调用构造函数的情况下创建对象。

如果您在Reflector中查看该function,您将看到它正在进行外部呼叫。 我不知道黑魔法究竟是如何发生在引擎盖下的。 但我确实向自己certificate构造函数从未被调用,但对象已被实例化。

您可以在CreateInstance上使用以下重载:

 public static Object CreateInstance( Type type, Object[] args ) 

在你的情况下,它(我认为):

 var designer = Activator.CreateInstance( typeof(DelayCompositeDesigner), new object[] { new DelayComposite(4) } ); 

我找到了问题的解决方案,我正在努力解决同样的问题。

这是我的激活者:

 private void LoadTask(FileInfo dll) { Assembly assembly = Assembly.LoadFrom(dll.FullName); foreach (Type type in assembly.GetTypes()) { var hasInterface = type.GetInterface("ITask") != null; if (type.IsClass && hasInterface) { var instance = Activator.CreateInstance(type, _proxy, _context); _tasks.Add(type.Name, (ITask)instance); } } } 

这是我的类激活,请注意我必须将构造函数params更改为对象,这是我可以使它工作的唯一方法。

 public class CalculateDowntimeTask : Task { public CalculateDowntimeTask(object proxy, object context) : base((TaskServiceClient)proxy, (TaskDataDataContext)context) { } public override void Execute() { LogMessage(new TaskMessage() { Message = "Testing" }); BroadcastMessage(new TaskMessage() { Message = "Testing" }); } } 

当我遇到这个问题时,我正在使用一个返回参数列表的方法来插入Activator.CreateInstance,它的参数数量与我试图创建的对象的构造函数不同。