在C#中的方法链接

我其实不知道这是什么在C#中调用。 但是我想添加functionallity到我的class级同时添加多个项目。

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

你提到的技术称为可链式方法。 在C#中创buildDSL或stream畅接口时,通常使用它。

典型的模式是让你的AddItem()方法返回它所属类(或接口)的一个实例。 这使得后续的呼叫被链接到它。

 public MyCollection AddItem( MyItem item ) { // internal logic... return this; } 

方法链接的一些替代方法,用于将项目添加到集合,包括:

使用params语法允许多个项目作为数组传递给您的方法。 当你想隐藏数组的创build并为你的方法提供一个可变的参数语法时很有用:

 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或IEnumerabletypes的重载,以便可以将多个项目一起传递到您的集合类。

 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#中调用”

stream利的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); 

这不是方法链接,而是在一次调用中将多个项目添加到对象中。

你可以添加一个扩展方法来支持这个,只要你的类inheritance自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; } }