我想知道是否可以“分类”我的扩展方法。
我创建了来自SQL世界的扩展(LEFT / RIGHT / COALESCE /(NOT)IN /(NOT)BETWEEN / ...),并希望在子方法“SQL”中扩展它,并像这样使用它:
"abc".SQL().Left(2);
还是应该创建一个引用此方法的静态类?
感谢您的任何建议,并告诉我这种情况下的最佳做法。
答案 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()