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#:)