2009-07-13 61 views
48

我實際上不知道這是什麼在C#中調用。 但我想添加functionallity到我的課上同時添加多個項目。在C中的方法鏈接#

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

回答

89

您提到的技術稱爲可鏈式方法。它通常用於在C#中創建DSL或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提及流暢的界面和提供鏈接 – 2009-07-13 14:44:42

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

不需要限制ADDITEM到MyClass的爭論。可能可能是Object或Item,或者其他東西。 – 2009-07-13 14:36:51

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

這不是方法鏈,但它增加了多個項目到您的在一個電話中的對象。

12

「其實我也沒有什麼這就是所謂的在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(); 
10

其他人直方法鏈方面回答,但如果你正在使用C#3.0,你可能會感興趣的集合初始化 ...他們僅是可當你做一個構造函數調用,只有當你的方法有適當Add方法和實現IEnumerable,但你可以這樣做:

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

你爲什麼不使用params關鍵字?

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