2010-04-18 85 views
3

我已經實現了一些擴展方法,並將它們放在單獨的類庫項目中。類庫項目中的擴展方法

想象我在類庫這樣一個簡單的擴展方法稱爲MD.Utility

namespace MD.Utility 
{ 
    public static class ExtenMethods 
    { 
     public static bool IsValidEmailAddress(this string s) 
     { 
      Regex regex = new Regex(@"^[\w-\.][email protected]([\w-]+\.)+[\w-]{2,4}$"); 
      return regex.IsMatch(s); 
     } 
    } 
} 

但無處在Web應用程序像App_Code文件夾或WebFroms代碼隱藏頁,我不能使用這個擴展方法。如果我這樣做:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using MD.Utility; 

public partial class _Default : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     string email = "[email protected]"; 
     if (email.IsValidEmailAddress()) 
     { 
      //To do 
     } 
    } 
} 

編譯器無法識別IsValidEmailAddress(),甚至沒有智能感知支持。

雖然如果我將我的擴展方法放在App_Code文件夾中,那麼可以在App_code文件夾或Web Form代碼隱藏頁面中的其他cs文件中使用。

回答

5

您是否記得在Web項目中添加對您的類庫的引用?

您將需要。除此之外,你的代碼看起來很好,並應該工作。

+0

有一個對classLibrary項目的引用,但我不知道爲什麼當我重建解決方案時,dll不會更新,如果我嘗試再次添加引用,它會提示已經有一個引用,當你說這應該是工作,我刪除了Dll並再次添加了引用,並且工作。感謝driis。你知道爲什麼我的Dll不會自動更新嗎? – Mostafa 2010-04-18 16:06:56

+0

聽起來很奇怪。還有一件事要檢查,就是該項目設置爲爲當前的構建配置構建。在你的工具欄上你有一個下拉菜單來切換配置(調試,發佈)。該下拉菜單中的最後一個元素將顯示一個對話框,您可以在其中選擇或取消選擇用於在各種構建配置中構建的項目。 – driis 2010-04-18 16:15:32

+0

@Mostafa,您可能一直在將您的庫DLL構建到與您引用的目錄不同的目錄中。 – 2010-04-18 16:51:17

2

如果在執行解決方案重建時更改沒有得到重新編譯,那麼它可能是您正在使用的引用的類型。如果MD.Utility項目位於您的Web項目解決方案中,則應將該參考設置爲「項目參考」。這將導致構建將該代碼視爲依賴關係,因此在您更改某些內容時重新構建它。如果您只是將它作爲DLL包含在內,那麼該DLL就被認爲是外部的,並且構建不會考慮它,即使它在同一個解決方案中。

-1

除了添加組件的參考,有什麼固定的,對我來說是明確地將它添加到文件「使用MD.Utility」。

+0

這已經在問題的代碼中完成了。 – Servy 2017-05-09 16:59:48

0

我發現如果消費項目的程序集名稱和命名空間相同,並且公用庫具有相同的命名空間,則會發生這種情況。

似乎編譯器會感到困惑。嘗試改變它們。

如其他地方所述,您需要將Common庫添加到每個耗用項目。並且包含共享庫中的擴展的模塊必須將標記爲Public。與類不同,Public不是模塊的默認範圍。不知道爲什麼。