我已经实现了一些扩展方法,并将它们放在单独的类库项目中。
想象一下,我在类库中有一个简单的扩展方法叫做 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);
}
}
}
但是在WebApp中没有像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 = "Someone@Somewhere.com";
if (email.IsValidEmailAddress())
{
//To do
}
}
}
编译器无法识别IsValidEmailAddress()甚至没有智能感知支持。
如果我将扩展方法放在App_Code文件夹中,则可以在App_code文件夹或Web窗体代码隐藏页面中的另一个cs文件中使用。
答案 0 :(得分:5)
您是否记得在Web项目中添加对类库的引用?
你需要那个。除此之外,你的代码看起来很好,应该可以工作。
答案 1 :(得分:2)
如果在执行解决方案重建时没有重新编译更改,那么它可能是您正在使用的引用类型。如果MD.Utility项目在您的Web项目解决方案中,您应该将引用作为“项目引用”。这将导致构建将该代码视为依赖项,因此在您更改某些内容时会重新构建它。如果您只是将其作为DLL包含,则DLL被视为外部,并且构建将不会考虑它,即使它在同一解决方案中。
答案 2 :(得分:0)
我能够通过扩展模块公开来解决它。 这篇文章可能会有所帮助: Extension methods in referenced assemblies?
答案 3 :(得分:0)
我发现如果使用项目的程序集名称和命名空间相同且Common库具有相同的命名空间,则会发生这种情况。
似乎编译器感到困惑。尝试更改它们。
如其他地方所述,您需要将Common库添加到每个消费项目中。包含公共库中的扩展名的模块必须标记为Public
。与类不同,Public
不是模块的默认范围。不知道为什么。
答案 4 :(得分:-1)
除了将程序集添加到引用之外,对我来说修复它的方法是使用MD.Utility"明确地将它添加到文件中。