C# 如何创建以下语法 方法(param => { params.xxx })?



在代码示例中,我看到了以下代码:

SomeClass.Columns(columns => {
columns.Add()
.Text("Product")
.Value("123");
columns.Add()
.Text("Amount")
.Value("456");
})

现在我想知道创建这种结构的要求是什么

其中columnsColumn对象的集合,并且.Text.ValueColumn对象上再次返回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);

相关内容

  • 没有找到相关文章

最新更新