错误CS1109扩展方法必须在顶级静态类中定义;模式是嵌套类

时间:2016-07-16 20:04:05

标签: c# c#-6.0

我想扩展字符串对象并将这些扩展作为嵌套类的一部分,但是直接这样做:

public static class StringExtensions
{
    public static class Patterns
    {
        public static string NumbersOnly(this string s)
        {
            return new String(s.Where(Char.IsDigit).ToArray());
        }
    }
}

...给出了这篇文章标题所述的错误。

我怎么能以不同的方式写这个,以便当我调用它时,它可以像这样调用:

string s = "abcd1234";
s = s.Patterns.NumbersOnly();

我知道我可以将NumbersOnly作为StringExtensions的直接子项移动以使错误消失,但我的目的是将方法组织成具有许多方法的类别。在这个例子中,NumbersOnly只是我打算在那里进行的大约40种模式匹配中的一种,我不希望用以下方法混淆对象的根:PatternNumbersOnlyNumbersOnly

注意:此问题与this one之类的问题不同,因为我不知道为什么会出现此问题,我正在寻找一种解决方法,以便我可以获得此错误原因的功能或类似功能否认了我。

1 个答案:

答案 0 :(得分:5)

你不能 - 没有"扩展属性"。

通过引入中间类从s.Patterns().NumbersOnly()扩展方法返回,您可以获得最佳效果 - Patterns

示例将所有方法放在单个类中,但只要扩展方法满足"在顶级静态类中定义":

,您就可以按照任何方式将它们组织到不同的类中。
public static class StringExtensions
{
  public class PatternsX
  { 
    public string Value {get;set;}
  }

  public static PatternsX Patterns(this string s)
  {
    return new PatternsX { Value = s};
  }

  public static string NumbersOnly(this PatternsX s)
  {
    return new String(s.Value.Where(Char.IsDigit).ToArray());
  }
}

....    
Console.WriteLine("123ver".Patterns().NumbersOnly()); // results in 123