ObservableValueGenerator 1.0.1
dotnet add package ObservableValueGenerator --version 1.0.1
NuGet\Install-Package ObservableValueGenerator -Version 1.0.1
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="ObservableValueGenerator" Version="1.0.1"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets> </PackageReference>
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="ObservableValueGenerator" Version="1.0.1" />
<PackageReference Include="ObservableValueGenerator"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets> </PackageReference>
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add ObservableValueGenerator --version 1.0.1
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
#r "nuget: ObservableValueGenerator, 1.0.1"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package ObservableValueGenerator@1.0.1
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=ObservableValueGenerator&version=1.0.1
#tool nuget:?package=ObservableValueGenerator&version=1.0.1
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
ObservableValueGenerator
基于 C# Incremental Source Generator 的代码生成器,自动为属性生成 ObservableValue<T> 包装属性。只需标记 [AsObservableValue],即可省去手动编写 Observable 包装的重复代码。
功能特性
- 类级别标记 — 在类上添加
[AsObservableValue],所有具有 getter 和 setter 的属性自动生成 Observable 包装 - 属性级别标记 — 在单个属性上添加
[AsObservableValue],按需精确控制 - partial 钩子方法 — 自动生成
On{Property}Changing/On{Property}Changed方法,可在 partial 类中实现变更拦截 - 编译期诊断 — 提供 4 条诊断规则,帮助发现配置错误
- 零运行时依赖 — 生成器以 NuGet Analyzer 形式分发,消费方无需引用生成器 DLL
安装
通过 NuGet 引用(作为开发依赖):
dotnet add package ObservableValueGenerator
或在 .csproj 中添加:
<PackageReference Include="ObservableValueGenerator" PrivateAssets="all" />
生成器以 Roslyn Analyzer 形式加载,不会出现在运行时依赖中。
使用方式
方式一:类级别标记(推荐)
在类上标记 [AsObservableValue],所有具有 get + set 的属性都会自动生成:
using ObservableValueGenerator;
[AsObservableValue]
public partial class MyViewModel
{
public string? Host { get; set; }
public int Port { get; set; } = 8080;
public string? Name { get; set; }
}
方式二:属性级别标记
在需要生成的单个属性上标记 [AsObservableValue]:
using ObservableValueGenerator;
public partial class MyViewModel
{
[AsObservableValue]
public string? Host { get; set; }
[AsObservableValue]
public int Port { get; set; } = 8080;
// 未标记,不会生成
public string? Name { get; set; }
}
生成的代码
对于属性 Host,生成器会在 partial 类中自动生成以下内容:
public partial class MyViewModel
{
/// <inheritdoc cref="Host"/>
[global::System.Text.Json.Serialization.JsonIgnore]
public global::Aprillz.MewUI.ObservableValue<string?> HostObservable =>
field ??= new(this.Host, value =>
{
OnHostChanging(value);
Host = value;
OnHostChanged(value);
return value;
});
partial void OnHostChanging(string? value);
partial void OnHostChanged(string? value);
}
使用生成的 ObservableValue
var vm = new MyViewModel { Host = "localhost", Port = 3000 };
// 获取 Observable 包装
var hostObs = vm.HostObservable;
var portObs = vm.PortObservable;
// 读取值
Console.WriteLine(hostObs.Value); // "localhost"
// 通过 Observable 修改值(会触发 partial 钩子并写回原属性)
hostObs.Value = "example.com";
Console.WriteLine(vm.Host); // "example.com"
Partial 钩子方法
每个生成的 Observable 属性都会生成一对 partial 钩子方法,你可以在 partial 类的其他文件中实现它们来监听值变化:
public partial class MyViewModel
{
partial void OnHostChanging(string? value)
{
Console.WriteLine($"[Changing] Host: {Host} -> {value}");
}
partial void OnHostChanged(string? value)
{
Console.WriteLine($"[Changed] Host = {value}");
}
}
诊断规则
| 代码 | 级别 | 说明 |
|---|---|---|
| OBS001 | Warning | 类缺少 partial 关键字,生成器无法为其添加 partial 成员 |
| OBS002 | Warning | 属性缺少 setter,无法生成 Observable 包装 |
| OBS003 | Error | 类中已存在 {PropertyName}Observable 属性,无法自动生成(命名冲突) |
| OBS004 | Warning | 类已标记 [AsObservableValue],属性上的 [AsObservableValue] 是多余的 |
前置要求
- .NET SDK 8.0+(或其他支持 C# 13
field关键字的版本) - 目标类必须声明为
partial - 需要 Observable 包装的属性必须同时具有 getter 和 setter
- 需要引用
ObservableValue<T>的实现(如Aprillz.MewUI.ObservableValue<T>)
项目结构
ObservableValueGenerator/
├── src/ObservableValueGenerator/ # 源码生成器(Roslyn Incremental Generator)
├── samples\SampleApp/ # 示例应用
└── ObservableValueGenerator.sln # 解决方案文件
许可证
MIT
There are no supported framework assets in this package.
Learn more about Target Frameworks and .NET Standard.
This package has no dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.