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' 的实体,则存在名称冲突的风险。此外,枚举执行程序集中的所有类型肯定是次优的。
话虽如此,但对于我尝试过的有限测试用例来说,它似乎工作正常
如果我在 .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' 的实体,则存在名称冲突的风险。此外,枚举执行程序集中的所有类型肯定是次优的。
话虽如此,但对于我尝试过的有限测试用例来说,它似乎工作正常