是否有像在C#中一样初始化F#中的WebHeaderCollection的好方法?
var wh = new WebHeaderCollection
{
{ "Content-Type", "application/json" }
};
答案 0 :(得分:5)
C#代码与以下F#相对应,如果在初始化集合时只需要在方法内部使用它,则看起来并不太糟糕:
let wh = WebHeaderCollection()
wh.Add("Content-Type", "application/json")
您可以定义各种助手来简化此过程。如果您想要一个漂亮的对象,则可以定义一个助手,该助手使用类名和要添加的项目列表,并通过静态成员约束来调用Add
方法(这也是C#编译器的工作) :
let inline create ctor list : ^T =
let res = ctor()
for k, v in list do
(^T : (member Add : ^K * ^V -> unit) (res, k, v))
res
使用此帮助程序,您可以按如下所示初始化集合:
let wh = create WebHeaderCollection ["Content-Type", "application/json"]
也就是说,除非您有充分的理由不这样做,否则我可能会直接调用Add
方法。
如果您需要初始化一些更复杂的结构,则最好以不同的方式考虑问题,并定义一些F#区分的联合和记录,以一种惯用的F#方式对您的域进行建模,而不是创建.NET对象直接。然后,您将编写一个将F#域转换为.NET对象的函数,但这只是一种转换(您可以使用漂亮的F#域来完成大部分工作)。