C#中的方法链接

Pat*_*ick 65 c#

我实际上不知道在C#中调用了什么.但是我想在我的类中添加functionallity以同时添加多个项目.

myObj.AddItem(mItem).AddItem(mItem2).AddItem(mItem3);
Run Code Online (Sandbox Code Playgroud)

LBu*_*kin 111

您提到的技术称为可链接方法.它通常在C#中创建DSL或流畅的接口时使用.

典型的模式是让您的AddItem()方法返回它所属的类(或接口)的实例.这允许后续调用链接到它.

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

   return this;
}
Run Code Online (Sandbox Code Playgroud)

方法链的一些替代方法,用于向集合添加项,包括:

使用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 );
Run Code Online (Sandbox Code Playgroud)

提供IEnumerable或IEnumerable类型的重载,以便可以将多个项目一起传递到您的集合类.

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

使用.NET 3.5集合初始化程序语法.您的类必须提供单个参数Add( item )方法,实现IEnumerable,并且必须具有默认构造函数(或者您必须在初始化语句中调用特定的构造函数).然后你可以写:

var myColl = new MyCollection { first, second, third, ... };
Run Code Online (Sandbox Code Playgroud)


Use*_*ser 33

使用这个技巧:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

它返回当前实例,它允许您链接方法调用(因此"同时"添加多个对象.


Mar*_*ell 15

"我实际上不知道在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();
Run Code Online (Sandbox Code Playgroud)


Jon*_*eet 11

其他人已经用直接方法链接来回答,但是如果你使用的是C#3.0,你可能会对集合初始化器感兴趣...它们只有在你进行构造函数调用时才可用,并且只有你的方法有适当的Add方法和实现时才可用IEnumerable,但是你可以这样做:

MyClass myClass = new MyClass { item1, item2, item3 };
Run Code Online (Sandbox Code Playgroud)


GC.*_*GC. 6

您可以添加一个扩展方法来支持这一点,前提是您的类继承自 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);
    }
}
Run Code Online (Sandbox Code Playgroud)
public static class ChainAdd
{
    public static ICollection<T> AddItem<T>(this ICollection<T> collection, T item)
    {
        collection.Add(item);
        return collection;
    }
}
Run Code Online (Sandbox Code Playgroud)


bru*_*nde 5

为什么不使用params关键字?

public void AddItem (params MyClass[] object)
{
    // Add the multiple items
}
Run Code Online (Sandbox Code Playgroud)