2010-04-18 58 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不是模块的默认范围。不知道为什么。