ReflectionIT.PropertyThrowGenerator
0.2.0-beta
Prefix Reserved
See the version list below for details.
dotnet add package ReflectionIT.PropertyThrowGenerator --version 0.2.0-beta
NuGet\Install-Package ReflectionIT.PropertyThrowGenerator -Version 0.2.0-beta
<PackageReference Include="ReflectionIT.PropertyThrowGenerator" Version="0.2.0-beta" />
<PackageVersion Include="ReflectionIT.PropertyThrowGenerator" Version="0.2.0-beta" />
<PackageReference Include="ReflectionIT.PropertyThrowGenerator" />
paket add ReflectionIT.PropertyThrowGenerator --version 0.2.0-beta
#r "nuget: ReflectionIT.PropertyThrowGenerator, 0.2.0-beta"
#:package ReflectionIT.PropertyThrowGenerator@0.2.0-beta
#addin nuget:?package=ReflectionIT.PropertyThrowGenerator&version=0.2.0-beta&prerelease
#tool nuget:?package=ReflectionIT.PropertyThrowGenerator&version=0.2.0-beta&prerelease
ReflectionIT.PropertyThrowGenerator
ReflectionIT.PropertyThrowGenerator is a source generator that adds validation to partial properties annotated with [ThrowIf...] attributes.
The generated setters call the appropriate Argument...Exception.ThrowIf... helper methods before assigning the value.
NuGet package
| Package | Version |
|---|---|
| ReflectionIT.PropertyThrowGenerator |
Requirements
LangVersionmust be C# 14.0 or higher because the generated code uses thefieldkeyword.TargetFrameworkmust be .NET 8.0 or higher because the generated code usesArgumentOutOfRangeExceptionthrow helper methods.
How it works
- Add the NuGet package to your project.
- Annotate a
partialproperty with one or more[ThrowIf...]attributes. - The generator emits the implementation part of the property and inserts the required validation logic into the
setorinitaccessor.
If a ThrowIf... attribute is used on a non-partial property, the analyzer reports a diagnostic.
Example
After installing the package, write code like this:
using ReflectionIT.PropertyThrowGenerator.Attributes;
partial class Employee {
[ThrowIfNull]
public required partial string Name { get; set; }
[ThrowIfNull]
[ThrowIfGreaterThan("London")]
public partial string City { get; set; } = string.Empty;
[ThrowIfGreaterThanOrEqual(16)]
public partial int Age { get; set; }
// Decimal attribute arguments are not supported directly, so use a string literal instead.
[ThrowIfGreaterThan("1234.56M")]
[ThrowIfNegative]
public partial decimal Salary { get; set; }
}
This generates a partial class with four validated properties:
partial class Employee
{
public required partial string Name {
get;
set {
global::System.ArgumentNullException.ThrowIfNull(value);
field = value;
}
}
public partial string City {
get;
set {
global::System.ArgumentNullException.ThrowIfNull(value);
global::System.ArgumentOutOfRangeException.ThrowIfGreaterThan(value, "London");
field = value;
}
}
public partial int Age {
get;
set {
global::System.ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual(value, 16);
field = value;
}
}
public partial decimal Salary {
get;
set {
global::System.ArgumentOutOfRangeException.ThrowIfGreaterThan(value, 1234.56M);
global::System.ArgumentOutOfRangeException.ThrowIfNegative(value);
field = value;
}
}
}
Attributes
ThrowIfEqualAttributeThrowIfGreaterThanAttributeThrowIfGreaterThanOrEqualAttributeThrowIfLessThanAttributeThrowIfLessThanOrEqualAttributeThrowIfNegativeAttributeThrowIfNegativeOrZeroAttributeThrowIfNotEqualAttributeThrowIfNullAttributeThrowIfNullOrEmptyAttributeThrowIfNullOrWhiteSpaceAttributeThrowIfZeroAttribute
Analyzer rules
The package also includes analyzers that help detect unsupported usage at compile time.
| Rule ID | Severity | Description |
|---|---|---|
PTG001 |
Error | Reported when the project uses a C# language version lower than 14.0. |
PTG002 |
Error | Reported when a ThrowIf... attribute is applied to a property that is not declared partial. |
PTG001: C# language version is not supported
This rule is reported when the consuming project does not use C# 14.0 or later.
The generator requires C# 14 because the generated code uses the field keyword.
PTG002: ThrowIf attributes require partial properties
This rule is reported when one of the ThrowIf... attributes is used on a property that is not declared partial.
Only partial properties are supported because the generator emits the implementation part of the property.
License
This project is licensed under the MIT License - see the LICENSE file for details.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- 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.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.3.1-beta | 36 | 6/2/2026 |
| 0.3.0-beta | 48 | 6/1/2026 |
| 0.2.0-beta | 57 | 4/29/2026 |
| 0.1.3-beta | 53 | 4/18/2026 |
| 0.1.2-beta | 54 | 4/18/2026 |
| 0.1.1-beta1 | 54 | 4/17/2026 |
Changes since 0.1.3-beta:
- Added analyzer PTG001 to report when the consuming project uses a C# language version lower than 14.0.
- Added analyzer PTG002 to report when ThrowIf attributes are applied to non-partial properties.
- Added XML documentation comments to the public attribute classes.
- Updated generated file naming and expanded the package README and requirements documentation.