Классифицировать собственные методы расширения - PullRequest
0 голосов
/ 10 мая 2011

Я хотел бы знать, возможно ли "классифицировать" мои методы расширения.

Я создал расширения, которые приходят из мира SQL (LEFT / RIGHT / COALESCE / (NOT) IN / (NOT)МЕЖДУ / ...) и хотел бы расширить его в подметоде «SQL» и использовать его следующим образом:

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

или я должен создать статический класс, который ссылается на этот метод?Спасибо за любой совет и расскажите мне лучшую практику в этом случае.

Ответы [ 3 ]

3 голосов
/ 10 мая 2011

Это то, что люди называют свободный интерфейс . Это только метод SQL (), который должен быть методом расширения (в строковом классе).Затем метод SQL может вернуть класс, имеющий методы , такие как Left () и Coalesce ().Если вы хотите сделать это расширяемым, вы можете расширить класс / интерфейс, который возвращает ваш метод SQL.

Все методы (Left, Coalesce и т. Д.) Могут возвращать один и тот же класс / интерфейс для получения потокасвободный интерфейс, такой как

string b = "abc".SQL().Left(2).Right(1).ToString();
3 голосов
/ 10 мая 2011

Вы можете создать SQL() как метод расширения, который возвращает класс, содержащий ваши расширения (как обычные методы), которые возвращают этот новый класс. Класс должен иметь свойство / поле, которое было вашим оригинальным объектом, который вызвал метод SQL().

РЕДАКТИРОВАТЬ: Благодаря @Kristoffer я теперь знаю, что это называется fluent interface; где API предназначен для более удобочитаемого кода.

0 голосов
/ 10 мая 2011

Вот как вы можете достичь этого.Код нуждается в некоторой настройке, но только для начала:

Сначала создайте класс типа «строитель», который манипулирует строкой, используя ваши методы 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);}
}

Это позволяет использовать такой API:

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