F # динамический доступ к объектам - PullRequest
14 голосов
/ 27 мая 2011

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

Ответы [ 3 ]

10 голосов
/ 29 июля 2011

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

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

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

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

9 голосов
/ 27 мая 2011

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

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

См. Также:

6 голосов
/ 27 мая 2011

Да, это так. Вы можете использовать оператор ? в 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 #:)

...