2009-07-13 2 views
48

私は実際にC#で何が呼び出されたのか分かりません。 しかし、複数のアイテムを同時に追加するには、functionallityをクラスに追加します。C#でのメソッドチェイン

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

答えて

89

あなたが言及しているテクニックは連鎖可能メソッドと呼ばれます。これは、DSLを作成するときによく使用され、C#ではfluent interfacesです。

典型的なパターンは、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, ... }; 
+4

流暢なインターフェイスに言及し、リンクを提供するための+1 +1 –

+1

+1新しいことを学んだ:D私はchaningメソッドのために別の方法を作ることを考えました – GaryNg

+0

これを行うと、 – starbeamrainbowlabs

32

このトリックを使用します。

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

それは、このように「同時に」複数のオブジェクトを追加する(チェーン・メソッド呼び出しにあなたをできるようになる現在のインスタンスを返します

+0

は、MyClassのにAddItemメソッドの引数を制限する必要はありません。おそらくObject、Item、または何か。 –

1

あなたの項目場合。リストとして機能している場合は、iListやiEnumerable/iEnumerableのようなインターフェースを実装したいかもしれません。

問わず、あなたは欲しい。

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

これはなんですか?

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

どの程度

AddItem(ICollection<Item> items); 

または

AddItem(params Item[] items); 

あなたがこれはメソッドチェーンではありませんが、それはあなたに複数の項目が追加されます。この

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

それらを使用することができます1つの呼び出しでオブジェクト。

12

流暢APIを「私は実際にこれをC#で呼ばれているものの見当がつかない」。 StringBuilderは、最も一般的な.NETの例です:

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

その他ストレートメソッドチェーンの観点で答えてきていますが、C#3.0を使用している場合は、コレクション初期化子に興味があるかもしれない...彼らだけです利用できるあなたは、コンストラクタの呼び出しを行い、そしてあなたの方法は、適切なAddメソッドを持っており、IEnumerableを実装していますが、その後、あなたがすることができる場合にのみとき:あなたはparamsキーワードを使用していないのはなぜ

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

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

あなたはこれをサポートするために拡張メソッドを追加することができ、あなたのクラスは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; 
    } 
} 
関連する問題