FSharp Отражение в скрипте fsx - определяет ли модуль переменную с именем foo?
Если у меня есть модуль имени MyModule
определено в скрипте.fsx и на него ссылается другой скрипт.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' не определен
1 ответ
Решение
Один из возможных (несколько глупых) подходов - перечислить все типы в исполняемой сборке:
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". Кроме того, перечисление всех типов в исполняемой сборке, безусловно, является неоптимальным.
С учетом вышесказанного кажется, что это нормально работает для ограниченных тестовых случаев, которые я пытался