在代码示例中,我看到了以下代码:
SomeClass.Columns(columns => {
columns.Add()
.Text("Product")
.Value("123");
columns.Add()
.Text("Amount")
.Value("456");
})
现在我想知道创建这种结构的要求是什么
其中columns
是Column
对象的集合,并且.Text
和.Value
是Column
对象上再次返回Object
的方法(以创建流畅的语法(。
columns.Add()
将返回一个new Column()
对象
SomeClass.Columns(???( 中方法中的参数是什么? 此语法是否有我可以研究的特定名称?
谢谢。
编辑:
是的,我的例子中有流畅的语法,但这不是我的问题,抱歉我不清楚。
问题是我如何进行以下操作:
SomeClass.Columns(columns => { ... })
那么列方法中的参数看起来如何?
谢谢。
在这种情况下,Columns
接受类似Action<ColumnCollection>
的东西。也就是说,你给它传递一个委托/lambda,它承诺调用该lambda,传入任何columns
,然后在你的lambda/delegate中你可以操纵集合。
首先需要一个集合类型,该集合类型创建一个新实例并在调用"Add"时返回它:
interface IList<T>
{
T Add();
}
然后是流畅的列类:
class Column
{
public Column Text(string text)
{
// Do stuff
return this;
}
public Column Value(string value)
{
// Do stuff
return this;
}
}
然后是SomeClass,它允许用户给出一个对"集合"执行的操作:
class SomeClass
{
private static IList<Column> localList;
public static void Columns(Action<IList<Column>> action)
{
// Perform action using localList as parameter
action(localList);
}
}
这将满足以下语法:
SomeClass.Columns(columns =>
{
columns.Add()
.Text("Product")
.Value("123");
columns.Add()
.Text("Amount")
.Value("456");
});
public static class SomeClass
{
public object void Columns(Func<Foo,object> action)
{
throw new Exception();
}
}
public class Foo
{
public Foo Add()
{
return this;
}
public Foo Value(object value)
{
return this;
}
public Foo Text(string text)
{
return this;
}
}
像这样使用:
SomeClass.Columns(columns =>
{
columns.Add().Text("SomeText");
columns.Add().Value("SomeValue");
return columns;
});
它被称为Fluent接口或Fluent方法。它的工作方式是.Add()
、.Text()
和.Value()
之后都返回它们正在执行操作的相同对象作为其返回值。这就是允许以这种方式链接操作的原因。Columns
只是返回这些完全相同对象的枚举。
这是一个高阶函数。在 c# 语言中,它像 Action 和 Func 类一样存在。 您的问题的答案和列方法的语义如下所示:
public ColumnCollection Columns(Func<ColumnCollection,ColumnCollection> columnCollectionFunc)
=> columnCollectionFunc(_someInternalColumnCollection);