2008-10-16 195 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" }); 
    } 
}