2008-10-16 78 views
13

我有具有以下构造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

构造VOOR类型 Vialis.LightLink.Controll er.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) 

所以应该接受我的代码,但我会尝试建议的代码

UPDATE:

我已经试过这样的建议:

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

的结果是一样的。

+0

蒂莫西 - 我已经修改了我的答案通过typeof运算(DelayCompositeDesigner)......或者也许我仍然缺少一块拼图。 – Kev 2008-10-16 15:01:31

+0

您可以展开designerAttribute.Designer如何声明? – Kev 2008-10-16 15:18:54

+0

Timothy - 是designerAttribute.Designer声明为Type? – Kev 2008-10-16 15:37:38

回答

13

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

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

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

12

我认为,您的通话将需要:

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

除非,当然,这是,在这种情况下,答案是不会立即明显。

+1

这对我来说非常合适 - 只是碰到同样的问题! – Spikeh 2013-07-02 19:36:23

0

我发现了另一种创建对象实例的方法,而不用调用构造函数,而对SF的另一个问题是answering

System.Runtime.Serialization命名空间有一个函数FormatterServices.GetUninitializedObject(类型),将不调用构造创建对象。

如果您在Reflector中查看该功能,您将看到它正在进行外部呼叫。我不知道引擎盖下实际上发生了什么黑魔法。但我向自己证明,构造函数从来没有被调用过,但对象被实例化了。

0

您可以使用下面的超负荷的CreateInstance:

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

对你来说这将会是(我认为):

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

如果你想调用此构造器...

public DelayCompositeDesigner(DelayComposite CompositeObject) 

...只是使用:

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

var designer = Activator.CreateInstance<DelayCompositeDesigner>(new DelayComposite(4)); 
5

虽然我讨厌类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的输出窗口中?

0

我发现问题的解决方案,我正在努力解决同样的问题。

这里是我的活化剂:

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<CalculateDowntimeTask> 
{ 
    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" }); 
    } 
} 
相关问题