如果我在。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'的实体,存在名称冲突的风险。此外,枚举执行程序集中的所有类型肯定不是最佳选择。
话虽如此,对于我尝试过的有限的测试用例,它似乎工作得很好