Stop writing INotifyPropertyChanged boilerplate. Let the compiler do it.
Zero runtime reflection. No IL weaving. No required base class. Inspectable generated C# for WPF, MAUI, Avalonia, Uno, WinUI, and Blazor ViewModels.
Keep CommunityToolkit.Mvvm for RelayCommand / messaging. Use NotifyGen for properties — no required ObservableObject, zero runtime package.
Add NotifyGen, click the lightbulb on [ObservableProperty] (NOTIFY023), and Fix All. Unmarked _logger / _disposed fields stay private.
→ Migration checklist & attribute map · Hybrid UI sample
dotnet add package NotifyGen<PackageReference Include="NotifyGen" Version="2.2.1">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageReference>using NotifyGen;
[Notify]
public partial class Person
{
private string _firstName;
private string _lastName;
[NotifyComputed]
public string FullName => $"{FirstName} {LastName}";
}NotifyGen generates equality-guarded setters, PropertyChanged, and optional hooks:
partial void OnFirstNameChanged(string oldValue, string newValue);| NotifyGen | CommunityToolkit.Mvvm | Fody.PropertyChanged | |
|---|---|---|---|
| Runtime dependency | None | Toolkit runtime | Weaver |
| Inspectable C# | Yes | Yes | No (IL) |
| Required base class | No (reuses host INPC) | ObservableObject typical |
No |
| Scope | Narrow INPC generator | Full MVVM toolkit | Property weaver |
Recommended stack: NotifyGen for properties, CommunityToolkit for RelayCommand / messaging. See the hybrid sample.
- Field → property (
_name→Name) and C# 14 partial-property mode [NotifyComputed]wires derived properties from the getter (or an explicit DependsOn list)[NotifyAlso]with transitive closure, target-sideNotifyFrom, child INPC, and collection membership- Typed
On{Property}Changed(old, new)hooks, changing events, suppressable bulk updates - Property /
property:/get:/set:metadata forwarding [NotifyProperty]opt-in (and CommunityToolkit[ObservableProperty]takeover) so mixed ViewModels do not publish_logger- Analyzer diagnostics NOTIFY001–NOTIFY023; code fixes for missing
partial(NOTIFY001 / NOTIFY006), underscore field names (NOTIFY002), unknown[NotifyAlso]names (NOTIFY003), and CommunityToolkit conversion (NOTIFY022 / NOTIFY023)
- Full feature reference
- Migrate from CommunityToolkit
[ObservableProperty] - Diagnostics catalog
- Samples — WPF, Avalonia, MAUI, Hybrid
- Changelog
- 2.0 launch post
- Docs site: https://georgepwall1991.github.io/NotifyGen/ — before/after generated code, CommunityToolkit migration, and samples
- .NET Standard 2.0+ consumers; Roslyn 4.8+ / modern .NET SDK for generation
- C# 14 / preview language version for incomplete partial-property mode
MIT — see LICENSE.

