DynamicObj 6.0.0

DynamicObj

F# library supporting Dynamic Objects including inheritance in functional style.

The library is compatible with Fable, allowing transpilation to javascript and python.

The primary use case of DynamicObj is the extension of F# classes with dynamic properties. This is useful when you want to add arbitrarily typed properties to a class at runtime.

Why would you want to do that?

Yes, The type system is one of the core strengths of F#, and it is awesome. However, there are cases where a static domain model is either unfeasible or not flexible enough, especially when interfacing with dynamic languages such as JavaScript or Python.

DynamicObj is transpilable into JS and Python via Fable, meaning you can use it to create classes that are usable in both .NET and those languages, while making their usage (e.g., the setting of dynamic properties) both safe in .NET and idiomatic in JS/Python.

Docs

Documentation is hosted at https://csbiology.github.io/DynamicObj/

Development

Requirements

  • nodejs and npm
    • verify with node --version (Tested with v18.16.1)
    • verify with npm --version (Tested with v9.2.0)
  • .NET SDK
    • verify with dotnet --version (Tested with 7.0.306)
  • Python
    • verify with py --version (Tested with 3.12.2, known to work only for >=3.11)

Local Setup

On windows you can use the setup.cmd to run the following steps automatically!

  1. Setup dotnet tools

    dotnet tool restore

  2. Install NPM dependencies

    npm install

  3. Setup python environment

    py -m venv .venv

Verify correct setup with ./build.cmd runtests

Showing the top 20 packages that depend on DynamicObj.

Packages Downloads
Plotly.NET
plotly.js charts in .NET programming languages 📈🚀.
7
Plotly.NET
plotly.js charts in .NET programming languages 📈🚀.
6

Breaking changes. Closed issues:

  • Deep copy: add native fallbacks for objects in js/py
  • Expand DeepCopy logic to mutable collections that contain primitives
  • Add a flag for DeepCopyPropertiesTo that enabled to omit static props Improve DynamicObj deep copy methods and refactor into a separate CopyUtils class for reuse: The following types/classes can be (recursively) deep copied now:
  • Basic F# types (bool, byte, sbyte, int16, uint16, int, uint, int64, uint64, nativeint, unativeint, float, float32, char, string, unit, decimal)
  • ResizeArrays and Dictionaries containing any combination of basic F# types
  • Dictionaries containing DynamicObj as keys or values in any combination with DynamicObj or basic F# types as keys or values
  • array<DynamicObj>, list<DynamicObj>, ResizeArray<DynamicObj>: These collections of DynamicObj are copied as a new collection with recursively deep copied elements.
  • System.ICloneable: If the property implements ICloneable, the Clone() method is called on the property.
  • DynamicObj (and derived classes): properties that are themselves DynamicObj instances are deep copied recursively. if a derived class has static properties (e.g. instance properties), these can be copied as dynamic properties on the new instance or ignored. Note on Classes that inherit from DynamicObj: Classes that inherit from DynamicObj will match the DynamicObj typecheck if they do not implement ICloneable. The deep copied instances will be cast to DynamicObj with deep copied dynamic properties. Staic/instance properties can be copied as dynamic properties on the new instance or be ignored. It should be possible to 'recover' the original type by checking if the needed properties exist as dynamic properties, and then passing them to the class constructor if needed.

.NET Standard 2.0

Version Downloads Last updated
7.1.0 7 04/04/2026
7.0.1 6 04/04/2026
7.0.0 6 04/04/2026
6.0.0 6 04/04/2026
5.0.0 6 04/04/2026
4.0.3 7 04/04/2026
4.0.2 5 04/04/2026
4.0.1 5 04/04/2026
4.0.0 5 04/04/2026
3.1.0 6 04/04/2026
3.0.0 5 04/04/2026
2.0.0 7 04/04/2026
1.0.1 6 04/04/2026
1.0.0 7 04/04/2026
0.2.1 6 04/04/2026
0.2.0 6 04/04/2026
0.1.0 6 04/04/2026
0.0.3 5 04/04/2026
0.0.2 6 04/04/2026
0.0.1 5 04/04/2026