2014-12-05 54 views
0

的方法我有一個包含兩種方法(和一些其他不相關)類庫:MissingMethodException調用帶有泛型參數

public T Foo<T>() 
{ 
    // Real version does some other things, but this is the gist. 
    return (T)this.Foo(); 
} 

public object Foo() 
{ 
    // Do stuff and return something. 
} 

到目前爲止好。這個庫編譯。

然而,當撥打時,我得到MissingMethodException。什麼可能導致這個?一切都很好。

作參考Foo不一般是傳統的方法,我介紹的通用版本,以幫助鑄造等

+0

聲音像一個項目沒有建立或舊的二進制文件在運行時使用(而編譯器使用新的二進制文件)。 – usr 2014-12-05 12:56:30

+1

當您在運行時使用的DLL與您編譯的DLL不同時,您通常會得到'MissingMethodException'。 – 2014-12-05 12:56:30

+0

正確地請清理你的解決方案並重建你的整個項目 – 2014-12-05 12:58:29

回答

0

我同意MissingMethodException是由於舊的DLL。但是,一旦你解決了這個問題,這仍然行不通。您不能隱式地將對象轉換爲字符串。在運行時,您的電話將調用(String)Foo(),其中Foo的類型爲Object。這基本上不會工作,除非你提供的T已經是object

Read more about type conversions here, including an explanation of narrowing versus widening casting.

什麼是你試圖用這段代碼呢?如果您希望始終使用或幾個類型的子集,那麼您可以爲它們定義顯式強制轉換。

+0

你的意思是「除非你提供的值已經是string類型的」。在許多情況下,你*知道你期待的類型,但舊的(非泛型的)代碼只能返回'object',然後這個構造完全可以包裝這些代碼。當然,演員陣容可能會在運行時失敗,但這是另一回事。必須提供'FooString','FooInt32'等等非常笨拙。 – 2014-12-05 23:12:51

+0

原來由於構建系統的複雜性,我錯過了舊的DLL。 實際使用情況是'.ExecuteScalar ()'你通常知道數據庫期望的類型。 – PaulEtherton 2014-12-24 11:38:01