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

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

Ответы

Ответ 1

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

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

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

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

Ответ 2

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

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

См. также:

Ответ 3

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

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

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

В этой статье мы рассмотрим, как использовать динамический оператор, чтобы сделать опыт использования ADO.NET из F # значительно лучше. Динамический оператор (на самом деле их два) являются простой способ поддержки динамических invoke в 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 #:)