类库项目中的扩展方法

5
我已经实现了一些扩展方法并将其放在一个单独的类库项目中。
假设在名为MD.Utility的类库中有一个简单的扩展方法,像这样:
namespace MD.Utility
{
    public static class ExtenMethods
    {
        public static bool IsValidEmailAddress(this string s)
        {
            Regex regex = new Regex(@"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$");
            return regex.IsMatch(s);
        }
    } 
}

但是在 Web 应用程序中,例如 App_code 文件夹或 WebForms 代码后台页面中,我无法使用这个扩展方法。如果我这样做:

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 = "Someone@Somewhere.com";
        if (email.IsValidEmailAddress())
        {
            //To do 
        }
    }
}

编译器无法识别IsValidEmailAddress(),甚至没有智能提示支持。
如果我将我的扩展方法放在App_Code文件夹中,在App_Code文件夹中的另一个.cs文件或WebForms代码后台页面中都可以使用它。
5个回答

7

你是否记得在网页项目中添加对类库的引用?

这一步是必须的。除此之外,你的代码看起来很好,应该能正常工作。


有一个关于classLibrary项目的引用,但我不知道为什么当我重新构建解决方案时Dll不会更新,如果我尝试再次添加引用,它会提示已经有一个引用。当你说应该可以工作时,我删除了Dll并再次添加了引用,这样就可以了。谢谢driis。你知道为什么我的Dll不会自动更新吗? - Mostafa
1
听起来有点奇怪。还有一件事要检查,那就是项目是否设置为构建您当前的构建配置。在工具栏上,您可以通过下拉菜单在各种构建配置(调试、发布)之间进行切换。下拉菜单中的最后一个元素将打开一个对话框,在那里您可以选择或取消选中不同构建配置中要构建的项目。 - driis
@Mostafa,你可能已经将你的库DLL构建到与你引用的不同的目录中了。 - Jeff Sternal

2
如果在进行解决方案重建时更改未被重新编译,则可能是您使用的引用类型不正确。如果MD.Utility项目位于您的Web项目解决方案中,您应该将引用设置为“项目引用”。这将使构建将该代码视为依赖项,因此在更改某些内容时重新构建它。如果您只将其作为DLL包含,则该DLL将被视为外部文件,即使它在同一解决方案中,构建也不会考虑它。

0
除了将程序集添加到引用中,对我有帮助的是在文件中显式地添加“using MD.Utility”。

+1。谢谢,这个解决了我的问题。我正在使用C#的.NET Core 3.1。我不得不在模板中添加@using来使用IsAjax()方法。请原谅我的过失,我将在此处发布代码:@inject Microsoft.AspNetCore.Http.IHttpContextAccessor HttpContextAccessor; @using Midas.Extensions; @if (HttpContextAccessor.HttpContext.Request.IsAjax()) { <span>只有在使用Midas.Extensions后才能正常工作;</span> } - Bruno Cassol

0

是的,它必须是公共的。奇怪的是,这不是默认设置。 - SteveCinq

0

我发现如果消费项目的程序集名称和命名空间与公共库具有相同的命名空间,则会出现此问题。

似乎编译器会感到困惑。尝试更改它们。

如其他地方所述,您需要将公共库添加到每个消费项目中。包含公共库中扩展的模块必须标记为Public。与类不同,Public不是模块的默认范围。不知道为什么。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接