Способ подключения в C#
Я на самом деле понятия не имею, что это называется в C#. Но я хочу, чтобы добавить функциональность, чтобы мой класс, чтобы добавить несколько элементов одновременно.
myObj.AddItem(mItem).AddItem(mItem2).AddItem(mItem3);
9 ответов:
техника, которую вы упомянули, называется цепными методами. Он широко используется при создании предметно-ориентированных языков или интерфейсы свободно в 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, ... };
использовать этот трюк:
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; } }
он возвращает текущий экземпляр, который позволит вам связывать вызовы методов (таким образом, добавляя несколько объектов "одновременно".
"Я на самом деле понятия не имею, как это называется в 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<Item> items);
или
AddItem(params Item[] items);
вы можете использовать их так
myObj.AddItem(new Item[] { item1, item2, item3 }); myObj.AddItem(item1, item2, item3);
это не метод цепочки, но он добавляет несколько элементов к объекту в один вызов.
вы можете добавить метод расширения для поддержки этого, если ваш класс наследует от 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; } }
Если ваш элемент действует как список, вы можете реализовать интерфейс, такой как iList или iEnumerable / iEnumerable.
независимо от того, ключ к цепочке вызовов, как вы хотите, возвращает объект, который вы хотите.
public Class Foo { public Foo AddItem(Foo object) { //Add object to your collection internally return this; } }