【问题标题】:How can I declare an extension with global scope across the solution如何在解决方案中声明具有全局范围的扩展
【发布时间】:2014-05-11 05:19:55
【问题描述】:

我正在尝试写一个扩展(实际上取自Case insensitive 'Contains(string)'

它在进行字符串比较时补偿了土耳其测试。扩展本身很简单:

public static bool Contains(this string source, string toCheck, StringComparison comp)
{
  return source.IndexOf(toCheck, comp) >= 0;
}

现在关键是我试图弄清楚在哪里/如何包含它,以便在整个解决方案(包含多个项目,每个项目都有自己的命名空间和类)中,它可以很容易地通过字符串访问。包含而无需执行 class.string.Contains 或其他方式。

假设有一个项目'Util'包含在所有其他项目中,有没有办法我可以把它放在 Util 中(没有类?),以便它可以作为 string.Contains 在解决方案中全局引用?

这甚至可能吗?如果有怎么办?

【问题讨论】:

  • C# 中的方法不允许在全局范围内声明。只有类、结构和委托是。
  • 所以没有办法“实现”所需的功能?唯一的答案是在每个需要它的类中包含该方法?

标签: c# global-scope turkey-test


【解决方案1】:

虽然我不推荐它,但您可以通过将代码包含在命名空间 System 下的公共静态类中轻松实现您的目标。

namespace System
{
   public static class CaseInsensitiveContains
   {
       public static bool Contains(this string source, string toCheck, StringComparison comp)
       {
           return source.IndexOf(toCheck, comp) >= 0;
       }
   }
}

没有静态类,你的扩展方法将无法工作。

将上述内容放入.cs 文件后,您不能在任何地方使用String.Contains,因为几乎所有代码都使用System 命名空间,这意味着它有点全局;)

【讨论】:

  • @rboy 听起来您误解了扩展方法的工作原理。您只需要string x = ""; x.Contains(...);
  • @rboy 所以这实际上是一个问题“如何使用扩展方法”?
【解决方案2】:

不,你不能这样做。您可以做什么,您可以创建一个实用程序类库并将其引用添加到您要调用或使用如下函数的其他项目中:

namespace Utility
{
    public class StringUtil
    {
        public static bool Contains(string source, string toCheck, StringComparison comp)
        {
          return source.IndexOf(toCheck, comp) >= 0;
        }
    }
}


using Utility.StringUtil;

//call function
Contains(....);

using Utility;

//call function

StringUtil.Contains(....);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多