2010-04-07 69 views
38

在導入的程序集中存在擴展方法時需要遵守什麼條件?我在類庫項目中構建了一個項目,但在我的Web項目中沒有識別出引用該庫的項目。庫中的所有其他類和方法都是可信的,但是這種擴展方法不是。擴展方法在庫中使用時可見。未識別的擴展方法

+0

類似:http://stackoverflow.com/questions/1138848/net-list-distinct – 2010-04-07 16:48:15

回答

52

引用包含具有擴展方法的類的程序集是不夠的。您需要在每個要使用擴展方法的源文件中導入包含該類的名稱空間。

例如,使用LINQ到對象,則需要引用System.Core程序集並導入System.Linq的命名空間(其中包含與LINQ擴展方法的枚舉類):

using System.Linq; 
+0

我在引用該庫的我的類文件,使用說明和我的項目已經引用它。不知道還有什麼要做。 – ChiliYago 2010-04-07 16:56:31

+6

您的擴展方法和包含該方法的類是否是公共的?你是否仔細檢查過你沒有忘記方法簽名中的「this」?如果您不使用擴展方法語法來調用該方法,它會起作用嗎? – dtb 2010-04-07 17:01:30

+0

你需要找出命名空間你想要的擴展類中實現的,並在您想要擴展現有使用該命名空間中的C#代碼。你必須非常具體。 – dthorpe 2010-04-07 17:02:03

14

您確定擴展方法是公開的嗎?

+0

是這個類被標記爲public static,因爲它是擴展方法。 – ChiliYago 2010-04-07 16:58:10

+3

Ohhhh YESSSSS!這是我的問題!非常感謝 ! – 2014-06-17 15:05:34

12

如果擴展方法不使用擴展語法時可調用,可以使用以下格式:

this.MyExtensionMethod() 

這清除了我沒有找到在VS2010類的擴展方法的問題。

+5

那麼使它成爲擴展方法有什麼意義? – 2014-12-02 10:43:38

+0

@IanKemp它仍然是清晰的語法比'MyExtensionMethodsClass.MyExtensionMethod(本)',並允許您通過更換你的'using'換出的實現。這是一種解耦/依賴注入。 – binki 2016-02-02 20:38:50

+0

@binki這似乎是我可以想象的做DI最不直觀和有用的方式。 – 2016-02-05 10:10:08

1

示例實現,幫助我:

(請注意,已經提到了this關鍵字)。

/// <summary> 
    /// Convert current bytes to string 
    /// </summary> 
    /// <param name="bytes">Current byte[]</param> 
    /// <returns>String version of current bytes</returns> 
    public static string StringValue(this byte[] currentBytes) 
    { 
     return string.Concat(Array.ConvertAll(bytes, b => b.ToString("X2"))); 
    } 
0

對於任何人想知道的問題,我有同樣的問題沒有答案工作。原來,這是因爲組件的using聲明別名:

using ex = MyApp.Example 

刪除別名工作,但我決定,而不是添加重複的,非別名using,這也解決了這一問題:

using MyApp.Example 
using ex = MyApp.Example 
0

我有這個問題,在解決方案的引用中使用擴展方法,如下所示。 Intellisense在ApplicationUI項目中爲擴展方法工作,它甚至運行時沒有編譯或運行時錯誤。但這種方法根本行不通。此外,立即窗口向我保證BusinessObjectLib.MyEnum不包含具有我的擴展方法名稱的方法,並且不能找到任何擴展方法。

GenericLib - project where extension method on generic enums is defined 
BusinessObjectLib - project where enums were defined, references GenericLib 
ApplicationUI - project referencing both GenericLib and BusinessObjectLib 

即使這樣,解決方案管理器看起來不錯,從ApplicationUI查看所有項目,當我打開BusinessObjectLib項目,我可以看到它的參考GenericLib被打破出於某種原因。 (就像我們所有的代碼一樣,VS也可能有錯誤?)。首先,我在VS中直接打開的BusinessObjectLib項目中工作,刪除ref,然後刪除項目,然後以相反的順序恢復。然後我重命名了ApplicationUI.sou文件並強制它重建。我能夠通過這些操作來解決這個問題,但只有.sou文件重命名似乎有訣竅。即時窗口仍然繼續給我同樣的錯誤,但至少運行時代碼再次工作。我在其他幾個項目中使用這種確切的模式,而沒有我在這裏遇到的那種問題。

2

任何人誰,同時具有在VB.NET同樣的問題在這裏登陸,請注意,不僅擴展方法,但模塊本身需要被標記爲Public,否則你會得到這個錯誤。至少在VS2015社區中情況就是這樣,在其他版本中也可能會出現這種情況。

0

在我的情況,擴展方法是在其中引用的不同版本的組件的外部參考。我在兩個項目上同步了版本並且工作。

-1

確保如果使用模板,模板匹配的聲明是什麼與方法簽名中聲明,「本」 ..

所以,

SomeClass<string, string> test = new SomeClass<string, string>(); 

extensionMethod<key, val>(this SomeClass<key, Lazy<val>>, string val) 
{ 
} 

擴展方法將不會出現,因爲懶惰的包裝。

+0

不知道-1是爲了什麼,但是這是我的問題,我在擴展名改成類型和忘了做它的聲明和編譯器顯示沒有問題,沒有注意到它的時候了。 也許是因爲我說的模板意外,而不是仿製藥。但重點是。 – eaglei22 2017-06-06 20:07:33