C# 分类自己的扩展方法

C# 分类自己的扩展方法,c#,extension-methods,C#,Extension Methods,我想知道是否有可能“分类”我的扩展方法 我创建了来自SQL world(左/右/合并/(非)IN/(非)BETWEEN/…)的扩展,并希望在子方法“SQL”中对其进行扩展,并像这样使用它: "abc".SQL().Left(2); 或者我应该创建一个引用此方法的静态类吗 谢谢您的建议,并告诉我这种情况下的最佳做法。您可以创建SQL()作为一个entension方法,该方法返回一个类,该类包含返回这个新类的扩展(作为普通方法)。该类必须具有一个属性/字段,该属性/字段是调用SQL()方法的原始对

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

我创建了来自SQL world(左/右/合并/(非)IN/(非)BETWEEN/…)的扩展,并希望在子方法“SQL”中对其进行扩展,并像这样使用它:

"abc".SQL().Left(2);
或者我应该创建一个引用此方法的静态类吗


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

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


编辑:多亏了@kristofer,我现在知道这叫做
流畅的界面
;API设计为允许更可读的代码。

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


编辑:多亏了@kristofer,我现在知道这叫做
流畅的界面
;API设计为允许更可读的代码。

这就是人们所说的实际上只有SQL()方法需要作为扩展方法(在string类上)。然后,SQL方法可以返回一个类,该类具有类似Left()和Coalesce()的方法。如果希望使其可扩展,可以扩展SQL方法返回的类/接口

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

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

这就是人们所说的一场战争实际上只有SQL()方法需要作为扩展方法(在string类上)。然后,SQL方法可以返回一个类,该类具有类似Left()和Coalesce()的方法。如果希望使其可扩展,可以扩展SQL方法返回的类/接口

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

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

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

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

 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);}
}
"abc".SQL().Left(2).ToString()
这允许使用如下API:

static class StringExtensions
{
     public static SqlMethods SQL(this string s) {return new SqlMethods(s);}
}
"abc".SQL().Left(2).ToString()

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

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

 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);}
}
"abc".SQL().Left(2).ToString()
这允许使用如下API:

static class StringExtensions
{
     public static SqlMethods SQL(this string s) {return new SqlMethods(s);}
}
"abc".SQL().Left(2).ToString()

所以你想要嵌套的扩展方法?这确实忽略了扩展方法的全部要点……您不能扩展方法,只能扩展类型(方法的返回类型)。如果
SQL()
返回您自己的自定义类型,为什么不直接将这些方法添加到该类型中?@Chris:只是想知道这些方法正在使用SQL规则。。。但这可能是一种不好的做法;)我不完全理解你的问题。看来
SQL
String
的扩展方法?现在您想扩展
SQL
返回的类型,以添加
Left(Integer)
扩展方法的返回类型是什么?这就是你的新方法应该去的地方,如果你不能修改这个类型,那么你需要像你做的那样扩展它。
String
@Chris:见克里斯托弗的答案。我想做一个流畅的界面,但你是对的,应该扩展SQL;)所以你想要嵌套的扩展方法?这确实忽略了扩展方法的全部要点……您不能扩展方法,只能扩展类型(方法的返回类型)。如果
SQL()
返回您自己的自定义类型,为什么不直接将这些方法添加到该类型中?@Chris:只是想知道这些方法正在使用SQL规则。。。但这可能是一种不好的做法;)我不完全理解你的问题。看来
SQL
String
的扩展方法?现在您想扩展
SQL
返回的类型,以添加
Left(Integer)
扩展方法的返回类型是什么?这就是你的新方法应该去的地方,如果你不能修改这个类型,那么你需要像你做的那样扩展它。
String
@Chris:见克里斯托弗的答案。我想做一个流畅的界面,但你是对的,应该扩展SQL;)