fsx 脚本中的 FSharp Reflection - 模块是否定义了名称为 foo 的变量?

FSharp Reflection in fsx script - does the module define a variable of name 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"

以上尝试失败并出现错误:

The type 'MyModule' is not defined

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

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"

如果使用这种方法,我们需要注意如果我们有 2 个名为 'MyModule' 的实体,则存在名称冲突的风险。此外,枚举执行程序集中的所有类型肯定是次优的。

话虽如此,但对于我尝试过的有限测试用例来说,它似乎工作正常