分类自己的扩展方法

时间:2011-05-10 09:59:06

标签: c# extension-methods

我想知道是否可以“分类”我的扩展方法。

我创建了来自SQL世界的扩展(LEFT / RIGHT / COALESCE /(NOT)IN /(NOT)BETWEEN / ...),并希望在子方法“SQL”中扩展它,并像这样使用它:

"abc".SQL().Left(2);

还是应该创建一个引用此方法的静态类?

感谢您的任何建议,并告诉我这种情况下的最佳做法。

3 个答案:

答案 0 :(得分:3)

您可以将SQL()创建为一个entension方法,该方法返回一个包含扩展(作为常规方法)返回此新类的类。该类必须具有属性/字段,该属性/字段是调用SQL()方法的原始对象。

编辑:感谢@Kristoffer我现在知道这被称为fluent interface; API旨在允许更易读的代码。

答案 1 :(得分:3)

这就是人们所说的fluent interface实际上只有SQL()方法需要是扩展方法(在字符串类上)。然后,SQL方法可以返回一个具有方法的类,如Left()和Coalesce()。如果要使其可扩展,可以扩展SQL方法返回的类/接口。

方法(Left,Coalesce等)都可以返回相同的类/接口,以获得流畅的界面流,例如

string b = "abc".SQL().Left(2).Right(1).ToString();

答案 2 :(得分:0)

以下是如何实现这一目标的。代码需要一些调整,但只是为了让你开始:

首先,创建一个使用Sql方法操作字符串的'builder'类型

 class SqlMethods
 {
      string _target; // probably want to use a StringBuilder instead

      public SqlMethods(string target)
      {
          _target = target;
      }

      SqlMethods Left(int n)
      {
          _target = ...; // implementation of Left()
          return this;
      } 

      public override string ToString() {return _target;}
 }

通过扩展方法实例化此类,如下所示:

static class StringExtensions
{
     public static SqlMethods SQL(this string s) {return new SqlMethods(s);}
}

这允许这样的API:

"abc".SQL().Left(2).ToString()