C# 类库项目中的扩展方法

C# 类库项目中的扩展方法,c#,asp.net,extension-methods,class-library,C#,Asp.net,Extension Methods,Class Library,我已经实现了一些扩展方法,并将它们放在单独的类库项目中 假设我在类库中有一个简单的扩展方法,名为MD.Utility: namespace MD.Utility { public static class ExtenMethods { public static bool IsValidEmailAddress(this string s) { Regex regex = new Regex(@"^[\w-\.]+

我已经实现了一些扩展方法,并将它们放在单独的类库项目中

假设我在类库中有一个简单的扩展方法,名为
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\u 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 = "Someone@Somewhere.com";
        if (email.IsValidEmailAddress())
        {
            //To do 
        }
    }
}
编译器无法识别
IsValidEmailAddress()
,甚至没有IntelliSense支持


如果我将扩展方法放在
App\u code
文件夹中,它可以在
App\u code
文件夹中的另一个
.cs
文件或WebForms代码隐藏页面中使用。

您记得在web项目中添加对类库的引用吗


你会需要的。除此之外,您的代码看起来不错,应该可以正常工作。

如果在执行解决方案重建时未重新编译更改,则可能是您正在使用的引用类型。如果MD实用工具项目在Web项目解决方案中,则应将引用作为“项目引用”。这将导致生成将代码视为依赖项,因此在更改某些内容时将其重新构建。如果只将其作为DLL,那么DLL被认为是外部的,并且构建不会考虑它,即使它在同一个解决方案中。 我通过公开扩展模块解决了这个问题。 这篇文章可能会有帮助:

除了将程序集添加到引用中,对我来说,修复它的方法是显式地将其添加到文件“using MD.Utility”。

我发现,如果使用项目的程序集名称和命名空间相同,并且公共库具有相同的命名空间,则可能会发生这种情况

似乎编译器被搞糊涂了。试着改变它们


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

有一个对类库项目的引用,但我不知道为什么在我重建解决方案时Dll不更新,如果我再次尝试添加引用,它会提示已经有引用,当你说它应该可以工作时,我删除了Dll并再次添加引用,结果成功了。谢谢,德里斯。你知道为什么我的Dll不会自动更新吗?听起来很奇怪。要检查的另一件事是,项目已设置为针对当前生成配置生成。在工具栏上有一个用于在配置(调试、发布)之间切换的下拉列表。该下拉列表中的最后一个元素将弹出一个对话框,您可以在其中选择或取消选择要在各种生成配置中生成的项目。@Mostafa,您可能正在将库DLL生成到与您引用的目录不同的目录中。是的,它必须是公共的。奇怪的是,这不是默认值。谢谢你帮我解决了这个问题。将.NET Core 3.1与C#一起使用。我必须将\@using添加到模板中才能使用IsAjax()方法。原谅我的过错,我将在这里发布代码:\@inject Microsoft.AspNetCore.Http.ihttppcontextaccessor HttpContextAccessor\@使用Midas.Extensions\@if(HttpContextAccessor.HttpContext.Request.IsAjax()){仅在使用Midas.Extensions之后工作;}