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