Метод цепочки в C # - PullRequest
       7

Метод цепочки в C #

63 голосов
/ 13 июля 2009

На самом деле я понятия не имею, как это называется в C #. Но я хочу добавить в свой класс functionallity, чтобы добавить несколько элементов одновременно.

myObj.AddItem(mItem).AddItem(mItem2).AddItem(mItem3);

Ответы [ 9 ]

105 голосов
/ 13 июля 2009

Техника, которую вы упоминаете, называется цепными методами. Он обычно используется при создании DSL или плавных интерфейсов в C #.

Типичным примером является то, что ваш метод AddItem () возвращает экземпляр класса (или интерфейса), частью которого он является. Это позволяет подключать к нему последующие вызовы.

public MyCollection AddItem( MyItem item )
{
   // internal logic...

   return this;
}

Некоторые альтернативы цепочке методов для добавления элементов в коллекцию включают:

Использование синтаксиса params, чтобы несколько элементов были переданы в ваш метод в виде массива. Полезно, когда вы хотите скрыть создание массива и предоставить синтаксис аргумента переменной для ваших методов:

public void AddItems( params MyItem[] items )
{
    foreach( var item in items )
        m_innerCollection.Add( item );
}

// can be called with any number of arguments...
coll.AddItems( first, second, third );
coll.AddItems( first, second, third, fourth, fifth );

Предоставление перегрузки типа IEnumerable или IEnumerable, так что несколько элементов могут быть переданы вместе в класс вашей коллекции.

public void AddItems( IEnumerable<MyClass> items )
{
    foreach( var item in items )
         m_innerCollection.Add( item );
}

Использовать синтаксис инициализатора коллекции .NET 3.5. Ваш класс должен предоставить метод с одним параметром Add( item ), реализовать IEnumerable и должен иметь конструктор по умолчанию (или вы должны вызвать конкретный конструктор в операторе инициализации). Тогда вы можете написать:

var myColl = new MyCollection { first, second, third, ... };
32 голосов
/ 13 июля 2009

Используйте этот трюк:

public class MyClass
{
    private List<MyItem> _Items = new List<MyItem> ();

    public MyClass AddItem (MyItem item)
    {
        // Add the object
        if (item != null)
            _Items.Add (item)

        return this;
    }
}

Возвращает текущий экземпляр, который позволит вам связывать вызовы методов (таким образом, добавляя несколько объектов «одновременно».

14 голосов
/ 13 июля 2009

"На самом деле я понятия не имею, как это называется в c #"

Свободный API; StringBuilder является наиболее распространенным примером .NET:

var sb = new StringBuilder();
string s = sb.Append("this").Append(' ').Append("is a ").Append("silly way to")
     .AppendLine("append strings").ToString();
11 голосов
/ 13 июля 2009

Другие ответили с точки зрения прямой цепочки методов, но если вы используете C # 3.0, вас могут заинтересовать инициализаторы коллекций ... они доступны только при выполнении вызова конструктора, и только если ваш метод имеет соответствующие Add методы и реализует IEnumerable, но тогда вы можете сделать:

MyClass myClass = new MyClass { item1, item2, item3 };
5 голосов
/ 13 июля 2009

Почему бы вам не использовать ключевое слово params?

public void AddItem (params MyClass[] object)
{
    // Add the multiple items
}
3 голосов
/ 25 марта 2015

Вы можете добавить метод расширения для поддержки этого, если ваш класс наследует от ICollection:

[TestClass]
public class UnitTest1
{
    [TestMethod]
    public void CanChainStrings()
    {
        ICollection<string> strings = new List<string>();

        strings.AddItem("Another").AddItem("String");

        Assert.AreEqual(2, strings.Count);
    }
}
public static class ChainAdd
{
    public static ICollection<T> AddItem<T>(this ICollection<T> collection, T item)
    {
        collection.Add(item);
        return collection;
    }
}
3 голосов
/ 13 июля 2009

Как насчет

AddItem(ICollection<Item> items);

или

AddItem(params Item[] items);

Вы можете использовать их вот так

myObj.AddItem(new Item[] { item1, item2, item3 });
myObj.AddItem(item1, item2, item3);

Это не цепочка методов, но она добавляет несколько объектов к вашему объекту за один вызов.

1 голос
/ 13 июля 2009

Как то так?

class MyCollection
{
    public MyCollection AddItem(Object item)
    {
        // do stuff
        return this;
    }
}
1 голос
/ 13 июля 2009

Если ваш элемент действует как список, вы можете реализовать интерфейс, такой как iList или iEnumerable / iEnumerable.

В любом случае, ключом к цепочке вызовов, как вы хотите, является возвращение нужного вам объекта.

public Class Foo
{
   public Foo AddItem(Foo object)
   {
        //Add object to your collection internally
        return this;
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...