我对F#相当陌生,但是我对创建和读取自定义配置文件有疑问。我知道它在C#中的外观,例如,我有一个简单的配置文件
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="customSection" type="Tool.Lib.Config, Tool.Lib" />
</configSections>
<communicationSection>
<responseTimeoutInMs value="900000" />
</communicationSection>
</configuration>
基于c#的操作很简单。我正在创建名为Config的模型,其属性标记为ConfigurationProperty(女巫与xml节点名称有关,在本例中为responseTimeoutInMs),类似于:
[ConfigurationProperty("responseTimeoutInMs")]
public ResponseTimeoutConfigElement ResponseTimeoutInMs
{
get => (ResponseTimeoutConfigElement)base["responseTimeoutInMs"];
set => base["responseTimeoutInMs"] = value;
}
当然将值设置为ConfigurationElement,
public class ResponseTimeoutConfigElement : ConfigurationElement
{
[ConfigurationProperty("value", IsRequired = true, IsKey = true, DefaultValue = 0)]
public int Value => (int)base["value"];
}
这是一种很好的机制,我可以在读取配置时将转换器固定在其中并创建所需的类型。
我知道我可以使用ConfigurationManager和exe配置图读取默认配置,但这是使用键和值进行的基本配置读取。
所以我的问题是,F#中是否有与C#中类似的东西?
答案 0 :(得分:2)
我不确定使用“自定义配置文件”来获取的内容是否与您所追求的完全一样,但是在过去,我使用AppSettings Type Provider来获得对应用程序变量的强类型访问。
如果不合适,还可以使用更标准的XML type provider吗?
我发现类型提供程序对于避免为简单访问而编写样板代码非常有用,并且它们是F#开发的一个非常好的功能。
答案 1 :(得分:2)
在F#中,您可以执行与C#中几乎相同的操作:
type ResponseTimeoutConfigElement() =
inherit ConfigurationElement()
[<ConfigurationProperty("value", IsRequired = true, IsKey = true, DefaultValue = 0)>]
member this.Value = base.["value"] :?> int
type Config() =
inherit ConfigurationSection()
[<ConfigurationProperty("responseTimeoutInMs")>]
member this.ResponseTimeInMs
with get() = base.["responseTimeoutInMs"] :?> ResponseTimeoutConfigElement
and set (value: ResponseTimeoutConfigElement) = base.["responseTimeoutInMs"] <- value