Способ подключения в C#


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

myObj.AddItem(mItem).AddItem(mItem2).AddItem(mItem3);
9 52
c#

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;
   }
}

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

class MyCollection
{
    public MyCollection AddItem(Object item)
    {
        // do stuff
        return this;
    }
}