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

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

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

9 Solutions collect form web for “Метод-цепочка в C #”

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

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

 public MyCollection AddItem( MyItem item ) { // internal logic... return this; } 

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

Использование синтаксиса 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, чтобы несколько элементов могли быть переданы вместе вашему classу коллекции.

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

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

 var myColl = new MyCollection { first, second, third, ... }; 

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

 public class MyClass { private List _Items = new List (); public MyClass AddItem (MyItem item) { // Add the object if (item != null) _Items.Add (item) return this; } } 

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

«Я действительно не знаю, как это называется в 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(); 

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

 MyClass myClass = new MyClass { item1, item2, item3 }; 

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

 public void AddItem (params MyClass[] object) { // Add the multiple items } 

Как насчет

 AddItem(ICollection items); 

или

 AddItem(params Item[] items); 

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

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

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

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

 [TestClass] public class UnitTest1 { [TestMethod] public void CanChainStrings() { ICollection strings = new List(); strings.AddItem("Another").AddItem("String"); Assert.AreEqual(2, strings.Count); } } 
 public static class ChainAdd { public static ICollection AddItem(this ICollection collection, T item) { collection.Add(item); return collection; } } 

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

Независимо от того, ключ к цепочке вызовов, как вы хотите, возвращает объект, который вы хотите.

 public Class Foo { public Foo AddItem(Foo object) { //Add object to your collection internally return this; } } 

Что-то вроде этого?

 class MyCollection { public MyCollection AddItem(Object item) { // do stuff return this; } } 
  • Световая библиотека Unicode
  • Добавление неизвестных (во время разработки) свойств в ExpandoObject
  • Как прокручивать элемент в UWP
  • segmentation fault с помощью scanf
  • Модель-View-Presenter в WinForms
  • Отсутствует оператор return в компиляторе не-void
  • Элемент ViewData с ключом «XXX» имеет тип «System.Int32», но должен иметь тип «IEnumerable »,
  • Как реализовать memmove в стандартном C без промежуточной копии?
  • Различное поведение LIKE между моим приложением и мастером запросов Access
  • Как десериализация WCF создает объекты без вызова конструктора?
  • Строка parse для enums типа
  • Interesting Posts

    GCC с Visual Studio?

    Unicode grep для Windows

    Поддерживается ли домашняя группа Windows 7 (рабочая группа) и домен Windows Vista?

    Является ли файловая система частью операционной системы?

    Создание точки доступа WiFi на одном интерфейсе в Linux

    Скрытые особенности Xcode

    Как я могу поместить представление из UINavigationController и заменить его другим за одну операцию?

    Удалите пароль BIOS для HP ProBook 4530s (сброс BIOS)

    Android AutoCompleteTextView с фильтрацией пользовательских адаптеров не работает

    Создавать инкрементные / полные резервные копии с полностью зашифрованного диска с использованием TrueCrypt?

    Почему мой компьютер не работает на полной скорости?

    Windows 7 – Беспроводное подключение до входа в систему возможно?

    Как заблокировать вызов мобильного номера и получение сообщений в разработке приложений Android?

    Как реализуется std :: unordered_map

    Почему это вычитание не равно нулю?

    Давайте будем гением компьютера.