Skip to content
DLR interop for F# -- works like dynamic keyword in C#
F# HTML Shell CSS JavaScript
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
.ci Updated nunit runner May 20, 2015
.github Update dotnet.yml Oct 2, 2019
.vscode Added operators, better function names Jul 6, 2017
DocsSrc updated docs [skip ci] Apr 29, 2018
FSharp.Interop.Dynamic Added missing sourcelink Oct 3, 2019
Scripts Update examples on docs Oct 3, 2019
Tests not sure if empty modules are allowed Oct 2, 2019
docs Update examples on docs Oct 3, 2019
.appveyor.yml Upload snupkg as well Oct 3, 2019
.gitignore Update Docs again Sep 11, 2019
Directory.Build.props Rename Directory.build.props to Directory.Build.props Oct 2, 2019
Directory.Build.targets switch to `dotnet build` 👷 May 22, 2018
FSharp.Interop.Dynamic.sln Update sln file with dotnet sln May 22, 2018
FSharp.Interop.Dynamic.sln.DotSettings rename files Sep 13, 2016
License.txt added tests, updated Dynamitey May 25, 2013
NuGet.config switch to `dotnet build` 👷 May 22, 2018
README.md Update README.md Oct 3, 2019
after.FSharp.Interop.Dynamic.sln.targets switch to `dotnet build` 👷 May 22, 2018
build.fsx
monofx.props Switch to monofx.props file for `dotnet build` multi-target on mono May 22, 2018

README.md

FSharp.Interop.Dynamic NuGet Status

The F# Dynamic Operator, powered by the DLR. Compiled for .NET Standard 2.0, .NET Standard 1.6, .NET Framework 4.5

Install from NuGet

PM> Install-Package FSharp.Interop.Dynamic

Build Status

Platform Status
Nuget Deployment Build status
Mac/Linux/Windows Action Status
Coverage codecov Coverage Status

Bleeding edge feed on MyGet

MyGet Pre Release

Usage

target?Property, target?Property<-value, and target?Method(arg,arg2) allow you to dynamically get/set properties and call methods

Also Dyn.implicitConvert,Dyn.explicitConvert, comparison operators and more.

Examples:

System.Dynamic

open FSharp.Interop.Dynamic
let ex1 = ExpandoObject()
ex1?Test<-"Hi"//Set Dynamic Property
ex1?Test //Get Dynamic

MVC ViewBag

x.ViewBag?Name<-"George"

Dynamitey

open FSharp.Interop.Dynamic
open Dynamitey.DynamicObjects

let ComBinder = LateType("System.Dynamic.ComBinder, System.Dynamic, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")

let getPropertyNames (target:obj) =
  seq {
    yield! target.GetType().GetTypeInfo().GetProperties().Select(fun it -> it.Name)
    if (ComBinder.IsAvailable) then
      yield! ComBinder?GetDynamicDataMemberNames(target)
  }

Python Interop

open Python.Runtime
open FSharp.Interop.Dynamic
open FSharp.Interop.Dynamic.Operators
do
  use __ = Py.GIL()
  let math = Py.Import(“math”)
  math?cos(math?pi ?*? 2) |> printfn “%O”
  let sin = math?sin
  sin 5 |> printfn “%O”
  math?cos(5) ?+? sin(5) |> printfn “%O”

SignalR (.net framework version)

open FSharp.Interop.Dynamic
type MyHub =
    inherit Hub
    member x.Send (name : string) (message : string) =
        base.Clients.All?addMessage(name,message) |> ignore

Caveats:

The DLR is incompatible with interface explicit members, so are these operators, just like C#'s dynamic keyword.

.NET Core 2.0.0 to 2.0.2 had a major bug in the C# dynamic keyword with nested classes inside of generic classes.. You will know it from a substring argument length exception. .NET Framework 4.0+, .NET Core 1.x and .NET Core 2.0.3+ and later are unaffected.

Maintainer(s)

The default maintainer account for projects under "fsprojects" is @fsprojectsgit - F# Community Project Incubation Space (repo management)

You can’t perform that action at this time.