80 votes

Chaînage de méthodes en C#

En fait, je n'ai aucune idée de comment cela s'appelle en C#. Mais je veux ajouter la fonctionnalité à ma classe pour ajouter plusieurs éléments en même temps.

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

0 votes

stackoverflow.com/a/2055701/5558126 Donne un bon exemple de mise en œuvre

131voto

LBushkin Points 60611

La technique que vous mentionnez est appelée méthodes chaînables. Elle est couramment utilisée lors de la création de DSLs ou de interfaces fluides en C#.

Le modèle typique consiste à faire en sorte que la méthode AddItem() renvoie une instance de la classe (ou de l'interface) dont elle fait partie. Cela permet d'enchaîner les appels ultérieurs à cette méthode.

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

   return this;
}

Certaines alternatives au chaînage de méthodes, pour ajouter des éléments à une collection, incluent :

Utilisation de la params pour permettre à plusieurs éléments d'être transmis à votre méthode sous forme de tableau. Utile lorsque vous souhaitez masquer la création du tableau et fournir une syntaxe d'argument variable à vos méthodes :

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

Fournir une surcharge du type IEnumerable ou IEnumerable afin que plusieurs éléments puissent être transmis ensemble à votre classe de collection.

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

Utilisez la syntaxe de l'initialisateur de collection de .NET 3.5. Votre classe doit fournir un seul paramètre Add( item ) doivent implémenter IEnumerable, et doivent avoir un constructeur par défaut (ou vous devez appeler un constructeur spécifique dans la déclaration d'initialisation). Vous pouvez alors écrire :

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

1 votes

+J'ai appris de nouvelles choses :D Je pensais que je devais créer une méthode différente pour le changement de méthode.

34voto

User Points 13983

Utilisez cette astuce :

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

Elle renvoie l'instance courante, ce qui vous permettra d'enchaîner les appels de méthodes (et donc d'ajouter plusieurs objets "en même temps").

20voto

Marc Gravell Points 482669

"Je n'ai en fait aucune idée de ce qu'on appelle en c#"

Une API fluide ; StringBuilder est l'exemple .NET le plus courant :

var sb = new StringBuilder();
string s = sb.Append("this").Append(' ').Append("is a ").Append("silly way to")
     .AppendLine("append strings").ToString();

12voto

Jon Skeet Points 692016

D'autres ont répondu en termes de chaînage direct de méthodes, mais si vous utilisez C# 3.0, vous pourriez être intéressé par les éléments suivants initialisateurs de collection ... ils ne sont disponibles que lorsque vous faites un appel au constructeur, et seulement si votre type a les caractéristiques appropriées. Add et met en œuvre des méthodes IEnumerable mais vous pouvez le faire :

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

5voto

bruno conde Points 28120

Pourquoi n'utilisez-vous pas le params mot-clé ?

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X