WebHeaderCollection便捷初始化程序F#

时间:2018-08-20 23:42:37

标签: .net f#

是否有像在C#中一样初始化F#中的WebHeaderCollection的好方法?

var wh = new WebHeaderCollection
{
    { "Content-Type", "application/json" }
};

1 个答案:

答案 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#域来完成大部分工作)。