当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《Activator.CreateInstance找不到构造函数(MissingMethodException)》经验,为你挑选了3个好方法。

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

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

结果是一样的.



1> DocMax..:

我认为你的电话需要是:

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

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


这对我来说非常有效-遇到同样的问题!

2> leppie..:

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

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

我建议你遍历ConstructorInfo paramtype == typeof(DelayComposite)并对相应的参数进行操作.



3> VolkerK..:

虽然我讨厌类似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的输出窗口中打印了什么?

推荐阅读
乐韵答题
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有