F# динамический доступ к объектам

Есть ли способ получить доступ к членам (свойствам и методам) объекта DLR (например, экземпляра подкласса DynamicObject) в F#, который похож на C# dynamic?

3 ответа

Решение

Теперь в nuget есть модуль, который использует dlr для реализации динамического оператора. FSharp.Interop.Dynamic

У этого есть несколько преимуществ перед многими фрагментами там.

  • Производительность он использует Dynamitey для вызова dlr, который реализует кэширование и является библиотекой PCL
  • Обрабатывая методы, которые возвращают void, вы получите обязательное исключение, если не откажетесь от результатов этих действий.
  • Dlr обрабатывает случай автоматического вызова возврата делегата функцией, это также позволит вам сделать то же самое с FSharpFunc
  • Добавляет!? Префиксный оператор для обработки вызова динамических объектов и функций, которые не имеют тип во время выполнения.

    Это открытый исходный код, лицензия Apache, вы можете посмотреть на реализацию и примеры базового модульного тестирования.

Как упоминал Эриаван, ? Оператор ведет себя немного как dynamic введите C#. Статья о вызове SQL не зависит от DLR, потому что вы можете предоставить свою собственную реализацию ? оператор и компилятор использует его напрямую.

Я также написал краткий пример того, как использовать ? оператор для вызова участников с помощью DLR, который доступен на F# фрагментах и есть более сложная версия Мэтью Podwysocki. Другой фрагмент показывает, как использовать его для вызова стандартных типов.NET с помощью Reflection.

Смотрите также:

Да, это. Ты можешь использовать ? оператор в F#, и он будет выполнять то же самое в динамической типизации в C# и VB.NET в.NET 4.0. Для начала вы можете прочитать этот образец Dynamic SQLDataReader из блога Томаса Петричека:

http://tomasp.net/blog/dynamic-sql.aspx

Вот цитата из его статьи:

В этой статье мы рассмотрим, как использовать динамический оператор, чтобы значительно улучшить опыт использования ADO.NET из F#. Динамический оператор (на самом деле их два) - это простой способ поддержки динамического вызова в F#. Мы можем использовать его для написания кода, который выглядит почти как обычный вызов метода или доступа к свойству, но динамически разрешается во время выполнения (с использованием имени метода или свойства). В следующем примере показано, что мы сможем написать в конце этой статьи:

// Call 'GetProducts' procedure with 'CategoryID' set to 1
use conn = new DynamicSqlConnection(connectionString)
use cmd = conn?GetProducts
cmd?CategoryID <- 1
conn.Open()

// Read all products and print their names
use reader = cmd.ExecuteReader()
while reader.Read() do
  printfn "Product: %s" reader?ProductName

Если вы когда-либо пытались вызвать хранимую процедуру SQL напрямую, используя SqlCommand, то вы наверняка сможете оценить элегантность этого фрагмента кода. Давайте теперь рассмотрим более крупный пример и некоторые изящные приемы, которые делают это возможным...

А для получения дополнительной информации, вы можете прочитать остальную часть его статьи. Удачного динамического кодирования в F#:)

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