{"id":44894498,"url":"https://github.com/reactiveui/reactiveui.binding.sourcegenerators","last_synced_at":"2026-03-09T22:08:24.839Z","repository":{"id":338966840,"uuid":"1152011623","full_name":"reactiveui/ReactiveUI.Binding.SourceGenerators","owner":"reactiveui","description":"The source generation binding engine for ReactiveUI","archived":false,"fork":false,"pushed_at":"2026-02-17T15:00:21.000Z","size":470,"stargazers_count":0,"open_issues_count":2,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-02-17T15:30:53.625Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/reactiveui.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":["reactivemarbles"]}},"created_at":"2026-02-07T08:10:51.000Z","updated_at":"2026-02-17T11:34:37.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/reactiveui/ReactiveUI.Binding.SourceGenerators","commit_stats":null,"previous_names":["reactiveui/reactiveui.binding.sourcegenerators"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/reactiveui/ReactiveUI.Binding.SourceGenerators","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/reactiveui%2FReactiveUI.Binding.SourceGenerators","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/reactiveui%2FReactiveUI.Binding.SourceGenerators/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/reactiveui%2FReactiveUI.Binding.SourceGenerators/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/reactiveui%2FReactiveUI.Binding.SourceGenerators/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/reactiveui","download_url":"https://codeload.github.com/reactiveui/ReactiveUI.Binding.SourceGenerators/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/reactiveui%2FReactiveUI.Binding.SourceGenerators/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29556404,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-17T18:16:07.221Z","status":"ssl_error","status_checked_at":"2026-02-17T18:16:04.782Z","response_time":100,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-02-17T20:00:40.179Z","updated_at":"2026-02-21T13:05:20.880Z","avatar_url":"https://github.com/reactiveui.png","language":"C#","funding_links":["https://github.com/sponsors/reactivemarbles"],"categories":[],"sub_categories":[],"readme":"[![NuGet Stats](https://img.shields.io/nuget/v/ReactiveUI.Binding.svg)](https://www.nuget.org/packages/ReactiveUI.Binding) [![Build](https://github.com/reactiveui/ReactiveUI.Binding.SourceGenerators/actions/workflows/ci-build.yml/badge.svg)](https://github.com/reactiveui/ReactiveUI.Binding.SourceGenerators/actions/workflows/ci-build.yml) [![Code Coverage](https://codecov.io/gh/reactiveui/ReactiveUI.Binding.SourceGenerators/branch/main/graph/badge.svg)](https://codecov.io/gh/reactiveui/ReactiveUI.Binding.SourceGenerators) [![License](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)\n\u003cbr\u003e\n\u003ca href=\"https://www.nuget.org/packages/ReactiveUI.Binding\"\u003e\n    \u003cimg src=\"https://img.shields.io/nuget/dt/ReactiveUI.Binding.svg\"\u003e\n\u003c/a\u003e\n\u003ca href=\"https://reactiveui.net/slack\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/chat-slack-blue.svg\"\u003e\n\u003c/a\u003e\n\u003ca href=\"https://github.com/reactiveui/ReactiveUI.Binding.SourceGenerators/labels/good%20first%20issue\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/first--timers--only-friendly-blue.svg\"\u003e\n\u003c/a\u003e\n\u003ca href=\"https://github.com/reactiveui/ReactiveUI.Binding.SourceGenerators/stargazers\"\u003e\n    \u003cimg src=\"https://img.shields.io/github/stars/reactiveui/ReactiveUI.Binding.SourceGenerators.svg?style=social\"\u003e\n\u003c/a\u003e\n\n\u003cimg src=\"images/logo.png\" width=\"200\"\u003e\n\n# ReactiveUI.Binding.SourceGenerators\n\nA C# source generator that replaces ReactiveUI's runtime expression-tree binding engine with compile-time code generation. Zero reflection, fully AOT/trimming safe, 3-7x faster than the legacy engine.\n\n## Table of Contents\n\n- [What does it do?](#what-does-it-do)\n- [How does it work?](#how-does-it-work)\n- [How do I install?](#how-do-i-install)\n- [Supported APIs](#supported-apis)\n- [Usage Examples](#usage-examples)\n- [Supported Notification Mechanisms](#supported-notification-mechanisms)\n- [Packages](#packages)\n- [Rx Library Compatibility](#rx-library-compatibility)\n- [Performance](#performance)\n- [Diagnostics](#diagnostics)\n- [Architecture](#architecture)\n- [Core Team](#core-team)\n- [Contribute](#contribute)\n\n### Core Team\n\n\u003ctable\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"center\" valign=\"top\"\u003e\n        \u003cimg width=\"100\" height=\"100\" src=\"https://github.com/ChrisPulman.png?s=150\"\u003e\n        \u003cbr\u003e\n        \u003ca href=\"https://github.com/ChrisPulman\"\u003eChris Pulman\u003c/a\u003e\n        \u003cp\u003eLondon, UK\u003c/p\u003e\n      \u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\"\u003e\n        \u003cimg width=\"100\" height=\"100\" src=\"https://github.com/glennawatson.png?s=150\"\u003e\n        \u003cbr\u003e\n        \u003ca href=\"https://github.com/glennawatson\"\u003eGlenn Watson\u003c/a\u003e\n        \u003cp\u003eMelbourne, Australia\u003c/p\u003e\n      \u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n## What does it do?\n\nReactiveUI.Binding.SourceGenerators is an incremental source generator that analyses your `WhenChanged`, `WhenChanging`, `WhenAnyValue`, `WhenAny`, `WhenAnyObservable`, `BindOneWay`, `BindTwoWay`, `OneWayBind`, and `Bind` call sites at compile time and emits optimised, strongly-typed observation and binding code. It eliminates:\n\n- **Runtime expression-tree compilation** -- no `Expression\u003cFunc\u003cT\u003e\u003e` evaluation at runtime\n- **Reflection** -- all property access is generated as direct member access\n- **System.Reactive dependency in the base package** -- generated code uses lightweight built-in observables\n\nThe result is binding code that is AOT-safe, trimming-safe, and significantly faster than the legacy ReactiveUI binding engine.\n\n## How does it work?\n\nThe generator runs two pipelines during compilation:\n\n**Pipeline A (Type Detection)** scans your types for notification mechanisms (INotifyPropertyChanged, IReactiveObject, WPF DependencyObject, WinUI DependencyObject, Apple KVO, WinForms Component, Android View) and registers per-type observation factories via a `[ModuleInitializer]`.\n\n**Pipeline B (Invocation Detection)** scans method invocations and extracts lambda property paths at compile time. Each call site is identified by `[CallerFilePath]` + `[CallerLineNumber]`, and the generator emits a per-call-site optimised method that is dispatched to at runtime via a generated lookup table.\n\n```csharp\n// You write:\nvar obs = vm.WhenChanged(x =\u003e x.Name);\n\n// The generator emits a dispatch stub that captures caller info:\npublic static IObservable\u003cTReturn\u003e WhenChanged\u003cTObj, TReturn\u003e(\n    this TObj obj, Expression\u003cFunc\u003cTObj, TReturn\u003e\u003e property,\n    [CallerFilePath] string callerFilePath = \"\",\n    [CallerLineNumber] int callerLineNumber = 0) where TObj : class\n{\n    if (__GeneratedBindingDispatcher.TryGetWhenChanged(callerFilePath, callerLineNumber, obj, out var result))\n        return (IObservable\u003cTReturn\u003e)result!;\n    throw new InvalidOperationException(\"No generated binding found.\");\n}\n\n// And a per-call-site method with direct property access:\nprivate static IObservable\u003cstring\u003e __WhenChanged_0(MyViewModel obj)\n{\n    return new PropertyObservable\u003cstring\u003e(\n        obj, \"Name\", static o =\u003e ((MyViewModel)o).Name, true);\n}\n```\n\n## How do I install?\n\nInstall the `ReactiveUI.Binding` NuGet package. The source generator is automatically included.\n\n```\ndotnet add package ReactiveUI.Binding\n```\n\nIf you need `IScheduler` overloads (e.g. `ObserveOn`), also install the adapter package:\n\n```\ndotnet add package ReactiveUI.Binding.Reactive\n```\n\n### Supported Frameworks\n\n| Target | Versions |\n|--------|----------|\n| .NET | 8.0, 9.0, 10.0 |\n| .NET Framework | 4.6.2, 4.7.2, 4.8.1 |\n| NativeAOT | .NET 10.0+ |\n\n### Platform Packages\n\nPlatform-specific packages provide DependencyProperty observation and other platform integrations:\n\n| Platform | Package |\n|----------|---------|\n| WPF | `ReactiveUI.Binding.Wpf` |\n| WinForms | `ReactiveUI.Binding.WinForms` |\n| MAUI | `ReactiveUI.Binding.Maui` |\n\n## Supported APIs\n\n| API | Description |\n|-----|-------------|\n| `WhenChanged` | Observe property changes (after value has changed) |\n| `WhenChanging` | Observe property changes (before value changes, requires `INotifyPropertyChanging`) |\n| `WhenAnyValue` | ReactiveUI compatibility shim -- same semantics as `WhenChanged` |\n| `WhenAny` | Multi-property observation with selector |\n| `WhenAnyObservable` | Observe and switch between observable properties |\n| `BindOneWay` | One-way binding from source to target |\n| `BindTwoWay` | Two-way binding between source and target |\n| `OneWayBind` | ReactiveUI compatibility shim for one-way binding |\n| `Bind` | ReactiveUI compatibility shim for two-way binding |\n\nAll APIs support single properties, deep property chains (e.g. `x =\u003e x.Address.City`), and multi-property observation (up to 12 properties for `WhenAnyValue`/`WhenChanged`).\n\n## Usage Examples\n\n### Property Observation\n\n```csharp\n// Single property\nIObservable\u003cstring\u003e nameObs = vm.WhenChanged(x =\u003e x.Name);\n\n// Deep chain -- re-subscribes when intermediate objects change\nIObservable\u003cstring\u003e cityObs = vm.WhenChanged(x =\u003e x.Address.City);\n\n// Multiple properties with selector\nIObservable\u003cstring\u003e fullName = vm.WhenChanged(\n    x =\u003e x.FirstName,\n    x =\u003e x.LastName,\n    (first, last) =\u003e $\"{first} {last}\");\n\n// Before-change observation (requires INotifyPropertyChanging)\nIObservable\u003cstring\u003e nameChanging = vm.WhenChanging(x =\u003e x.Name);\n```\n\n### One-Way Binding\n\n```csharp\n// Bind source property to target property\nIDisposable binding = vm.BindOneWay(view, x =\u003e x.Name, x =\u003e x.NameLabel);\n\n// With converter\nIDisposable binding = vm.BindOneWay(view,\n    x =\u003e x.Age,\n    x =\u003e x.AgeLabel,\n    age =\u003e $\"Age: {age}\");\n```\n\n### Two-Way Binding\n\n```csharp\n// Bind source and target properties bidirectionally\nIDisposable binding = vm.BindTwoWay(view, x =\u003e x.Name, x =\u003e x.NameTextBox);\n\n// With converters\nIDisposable binding = vm.BindTwoWay(view,\n    x =\u003e x.Age,\n    x =\u003e x.AgeTextBox,\n    age =\u003e age.ToString(),\n    text =\u003e int.TryParse(text, out var n) ? n : 0);\n```\n\n### ReactiveUI Compatibility\n\n```csharp\n// WhenAnyValue is a drop-in replacement for ReactiveUI.WhenAnyValue\nIObservable\u003cstring\u003e obs = vm.WhenAnyValue(x =\u003e x.Name);\n\n// OneWayBind / Bind match ReactiveUI's binding API\nIDisposable binding = view.OneWayBind(vm, x =\u003e x.Name, x =\u003e x.NameLabel);\nIDisposable binding = view.Bind(vm, x =\u003e x.Name, x =\u003e x.NameTextBox);\n```\n\n### Scheduler Overloads\n\nScheduler overloads require the `ReactiveUI.Binding.Reactive` package:\n\n```csharp\nusing ReactiveUI.Binding.Reactive;\nusing System.Reactive.Concurrency;\n\n// Observe on a specific scheduler\nIObservable\u003cstring\u003e obs = vm.WhenChanged(x =\u003e x.Name, RxApp.MainThreadScheduler);\n\n// Bind with scheduler\nIDisposable binding = vm.BindOneWay(view, x =\u003e x.Name, x =\u003e x.NameLabel,\n    scheduler: RxApp.MainThreadScheduler);\n```\n\n## Supported Notification Mechanisms\n\nThe source generator detects and generates optimised code for each platform's notification mechanism:\n\n| Mechanism | Interface / Base Type | WhenChanged | WhenChanging | Affinity |\n|-----------|----------------------|:-----------:|:------------:|:--------:|\n| INotifyPropertyChanged | `System.ComponentModel.INotifyPropertyChanged` | Yes | -- | 21 |\n| INotifyPropertyChanging | `System.ComponentModel.INotifyPropertyChanging` | -- | Yes | 21 |\n| IReactiveObject | `ReactiveUI.IReactiveObject` | Yes | Yes | 24 |\n| WPF DependencyObject | `System.Windows.DependencyObject` | Yes | -- | 20 |\n| WinUI DependencyObject | `Microsoft.UI.Xaml.DependencyObject` | Yes | -- | 22 |\n| Apple KVO (NSObject) | `Foundation.NSObject` | Yes | -- | 25 |\n| WinForms Component | `System.ComponentModel.Component` | Yes | -- | 23 |\n| Android View | `Android.Views.View` | Yes | -- | 19 |\n\nHigher affinity values take priority when a type implements multiple mechanisms.\n\n## Packages\n\n| Package | Description | NuGet |\n|---------|-------------|-------|\n| `ReactiveUI.Binding` | Runtime library with lightweight observables. No System.Reactive dependency. | [![NuGet](https://img.shields.io/nuget/v/ReactiveUI.Binding.svg)](https://www.nuget.org/packages/ReactiveUI.Binding) |\n| `ReactiveUI.Binding.SourceGenerators` | Source generator (auto-referenced by the Binding package). | [![NuGet](https://img.shields.io/nuget/v/ReactiveUI.Binding.SourceGenerators.svg)](https://www.nuget.org/packages/ReactiveUI.Binding.SourceGenerators) |\n| `ReactiveUI.Binding.Reactive` | System.Reactive adapter for IScheduler overloads. | [![NuGet](https://img.shields.io/nuget/v/ReactiveUI.Binding.Reactive.svg)](https://www.nuget.org/packages/ReactiveUI.Binding.Reactive) |\n| `ReactiveUI.Binding.Wpf` | WPF DependencyProperty support. | [![NuGet](https://img.shields.io/nuget/v/ReactiveUI.Binding.Wpf.svg)](https://www.nuget.org/packages/ReactiveUI.Binding.Wpf) |\n| `ReactiveUI.Binding.WinForms` | WinForms Component support. | [![NuGet](https://img.shields.io/nuget/v/ReactiveUI.Binding.WinForms.svg)](https://www.nuget.org/packages/ReactiveUI.Binding.WinForms) |\n| `ReactiveUI.Binding.Maui` | MAUI BindableProperty support. | [![NuGet](https://img.shields.io/nuget/v/ReactiveUI.Binding.Maui.svg)](https://www.nuget.org/packages/ReactiveUI.Binding.Maui) |\n\n## Rx Library Compatibility\n\nThe base `ReactiveUI.Binding` package has **no dependency on System.Reactive**. All generated code returns `IObservable\u003cT\u003e` (the BCL interface), making it compatible with any Rx implementation.\n\n| Library | Compatibility | Notes |\n|---------|---------------|-------|\n| **System.Reactive** | Full support via `ReactiveUI.Binding.Reactive` adapter | IScheduler overloads, ObserveOn |\n| **R3** | Compatible via `IObservable\u003cT\u003e` | Generated code returns `IObservable\u003cT\u003e` which R3 can consume via `.ToObservable()` conversion. R3 uses its own `Observable\u003cT\u003e` abstract class rather than `IObservable\u003cT\u003e`, so native R3 types are not used directly in generated code. |\n| **Other Rx implementations** | Works out of the box | Any library that consumes `IObservable\u003cT\u003e` is compatible |\n\n## Performance\n\n### Source-Generated vs ReactiveUI Expression-Tree Engine\n\nAll benchmarks use 1,000 property changes per iteration. Measured on AMD Ryzen 7 5800X, .NET SDK 10.0.102.\n\n#### Property Observation (WhenChanged vs WhenAnyValue)\n\n**Source-Generated (this project):**\n\n| Method | Runtime | Mean | Allocated |\n|--------|---------|-----:|----------:|\n| Single Property | .NET 10.0 | 220 us | 63 KB |\n| Deep Chain | .NET 10.0 | 304 us | 64 KB |\n| Two Properties | .NET 10.0 | 315 us | 88 KB |\n| First Observation | .NET 10.0 | 9.9 us | 0.9 KB |\n| Single Property | .NET 8.0 | 238 us | 63 KB |\n| Deep Chain | .NET 8.0 | 310 us | 64 KB |\n| Two Properties | .NET 8.0 | 328 us | 88 KB |\n| First Observation | .NET 8.0 | 11.1 us | 0.9 KB |\n| Single Property | NativeAOT 10.0 | 36 us | 64 KB |\n| Deep Chain | NativeAOT 10.0 | 42 us | 65 KB |\n| Two Properties | NativeAOT 10.0 | 61 us | 89 KB |\n| First Observation | NativeAOT 10.0 | 4.9 us | 1.1 KB |\n\n**ReactiveUI Expression-Tree Engine (baseline):**\n\n| Method | Runtime | Mean | Allocated |\n|--------|---------|-----:|----------:|\n| Single Property | .NET 10.0 | 1,032 us | 391 KB |\n| Deep Chain | .NET 10.0 | 1,101 us | 395 KB |\n| Two Properties | .NET 10.0 | 2,216 us | 759 KB |\n| First Observation | .NET 10.0 | 29.4 us | 4.9 KB |\n| Single Property | .NET 8.0 | 1,086 us | 388 KB |\n| Deep Chain | .NET 8.0 | 1,163 us | 391 KB |\n| Two Properties | .NET 8.0 | 2,225 us | 760 KB |\n| First Observation | .NET 8.0 | 33.4 us | 4.9 KB |\n\n**Summary:**\n\n| Scenario | Speedup | Allocation Reduction |\n|----------|--------:|---------------------:|\n| Single Property (.NET 10.0) | 4.7x faster | 6.2x less |\n| Deep Chain (.NET 10.0) | 3.6x faster | 6.2x less |\n| Two Properties (.NET 10.0) | 7.0x faster | 8.6x less |\n| First Observation (.NET 10.0) | 3.0x faster | 5.4x less |\n\nThe ReactiveUI expression-tree engine cannot run under NativeAOT due to its use of runtime reflection and expression compilation. The source-generated engine runs under NativeAOT with an additional 6x speedup over JIT.\n\n#### Binding (BindOneWay / BindTwoWay)\n\n**Source-Generated:**\n\n| Method | Runtime | Mean | Allocated |\n|--------|---------|-----:|----------:|\n| BindOneWay | .NET 10.0 | 286 us | 64 KB |\n| BindTwoWay | .NET 10.0 | 387 us | 88 KB |\n| First Binding | .NET 10.0 | 13.4 us | 1.3 KB |\n| BindOneWay | NativeAOT 10.0 | 47 us | 65 KB |\n| BindTwoWay | NativeAOT 10.0 | 58 us | 88 KB |\n\n**ReactiveUI Expression-Tree Engine:**\n\n| Method | Runtime | Mean | Allocated |\n|--------|---------|-----:|----------:|\n| OneWayBind | .NET 10.0 | 2,543 us | 522 KB |\n| Bind | .NET 10.0 | 3,128 us | 746 KB |\n| First OneWayBind | .NET 10.0 | 55.6 us | 12.5 KB |\n\n**Summary:**\n\n| Scenario | Speedup | Allocation Reduction |\n|----------|--------:|---------------------:|\n| One-Way Binding (.NET 10.0) | 8.9x faster | 8.2x less |\n| Two-Way Binding (.NET 10.0) | 8.1x faster | 8.5x less |\n| First Binding (.NET 10.0) | 4.1x faster | 9.6x less |\n\n## Diagnostics\n\nThe separate analyzer package reports the following diagnostics:\n\n| ID | Severity | Description |\n|----|----------|-------------|\n| RXUIBIND001 | Info | Expression must be an inline lambda for compile-time optimisation. Variable or method references fall back to runtime. |\n| RXUIBIND002 | Warning | Type has no observable properties and does not implement any observable notification mechanism. |\n| RXUIBIND003 | Warning | Expression accesses a private or protected member which cannot be observed by a generated extension method. |\n| RXUIBIND004 | Warning | Type does not support before-change notifications (WhenChanging). WPF DependencyObjects, WinForms Components, and Android Views only support after-change notifications. |\n| RXUIBIND005 | Info | Source type implements INotifyDataErrorInfo; validation state propagation is not generated and requires runtime engine or manual ErrorsChanged subscription. |\n| RXUIBIND006 | Warning | Expression contains an unsupported path segment (indexer, field, or method call). Only simple property access chains can be observed by the source generator. |\n\n## Architecture\n\n```\nsrc/\n  ReactiveUI.Binding/                        Runtime library, lightweight observables, IObservable\u003cT\u003e\n  ReactiveUI.Binding.SourceGenerators/       Incremental source generator (netstandard2.0)\n  ReactiveUI.Binding.Analyzer/              Roslyn analyzer for RXUIBIND diagnostics\n  ReactiveUI.Binding.Reactive/              System.Reactive adapter (IScheduler overloads)\n  ReactiveUI.Binding.Wpf/                   WPF DependencyProperty integration\n  ReactiveUI.Binding.WinForms/              WinForms Component integration\n  ReactiveUI.Binding.Maui/                  MAUI BindableProperty integration\n```\n\nThe generator and analyzer both target netstandard2.0 (Roslyn requirement). The runtime library targets .NET 8.0, 9.0, 10.0, and .NET Framework 4.6.2-4.8.1. Generated output is C# 7.3 compatible to support the widest range of consumer projects.\n\n## Contribute\n\nReactiveUI.Binding.SourceGenerators is developed under an OSI-approved open source license, making it freely usable and distributable, even for commercial use. We value the people who are involved in this project, and we'd love to have you on board, especially if you are just getting started or have never contributed to open-source before.\n\nSo here's to you, lovely person who wants to join us -- this is how you can support us:\n\n* [Responding to questions on GitHub Discussions](https://github.com/reactiveui/ReactiveUI.Binding.SourceGenerators/discussions)\n* [Passing on knowledge and teaching the next generation of developers](http://ericsink.com/entries/dont_use_rxui.html)\n* Submitting documentation updates where you see fit or lacking.\n* Making contributions to the code base.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Freactiveui%2Freactiveui.binding.sourcegenerators","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Freactiveui%2Freactiveui.binding.sourcegenerators","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Freactiveui%2Freactiveui.binding.sourcegenerators/lists"}