fsx脚本中的FSharp反射-模块是否定义了一个名为foo的变量



如果我在。fsx脚本中定义了一个名称为MyModule的模块,并从另一个。fsx脚本中引用;是否有可能在运行时确定模块是否定义了变量foo ?

我正在尝试实现这样的东西:

let fooWithDefault = 
    let cfgType:Type = typedefof<MyModule>
    let propOpt = 
        cfgType.GetProperties()
        |> Seq.tryFind( fun p -> p.Name = "foo")
    match propOpt with
    | Some foo -> foo.GetValue(null).ToString()
    | None -> "My Default Value for f"

上面的尝试失败,报错:

类型'MyModule'没有定义

一种可能的(有些笨拙的)方法是枚举执行程序集中的所有类型:

let fooWithDefault = 
    let cfgType = 
        Assembly.GetExecutingAssembly().GetTypes()
        |> Seq.find(fun t -> t.Name = "MyModule")
    let propOpt = 
        cfgType.GetProperties()
        |> Seq.tryFind( fun p -> p.Name = "foo")
    match propOpt with
    | Some foo -> foo.GetValue(null).ToString()
    | None -> "My Default Value for f"

如果使用这种方法,我们需要意识到,如果我们有两个名为'MyModule'的实体,存在名称冲突的风险。此外,枚举执行程序集中的所有类型肯定不是最佳选择。

话虽如此,对于我尝试过的有限的测试用例,它似乎工作得很好

相关内容

  • 没有找到相关文章

最新更新