类库项目中的扩展方法

时间:2010-04-18 15:55:12

标签: 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-\.]+@([\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文件中使用。

5 个答案:

答案 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"明确地将它添加到文件中。