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". Кроме того, перечисление всех типов в исполняемой сборке, безусловно, является неоптимальным.

С учетом вышесказанного кажется, что это нормально работает для ограниченных тестовых случаев, которые я пытался

Другие вопросы по тегам