A source generator that helps re-defining C# record's PrintMembers method to force include/exclude certain members.
This project is related to dotnet/csharplang#3925.
For more information about source generators, see Introducing C# source generators blog.
C# 9.0 introduced a new language feature called Records. A record is simply a reference type with some compiler-generated (synthesized) methods.
The interest of this project is on PrintMembers method, which the compiler uses when you call .ToString() on a record.
The compiler only includes all public non-override instance fields/properties in PrintMembers, and allows you to re-define PrintMembers if the provided implementation doesn't suite your need.
This source generator makes it easier to force-include or force-exclude certain record members in PrintMembers implementation through a provided attribute.
Currently, this is not packed into a NuGet package. So you'll have to clone the source code, and add a reference to the PrintMembersSourceGenerators.csproj. The added reference should look like the following:
<ItemGroup>
<ProjectReference Include="PATH TO PrintMembersGenerator.csproj"
OutputItemType="Analyzer"
ReferenceOutputAssembly="false" />
</ItemGroup>First of all, here is the internal definition of the attribute:
namespace SourceGenerator
{
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
public sealed class PrintMembersAttribute : Attribute
{
public bool ShouldInclude { get; set; } = true;
}
}As you see, the attribute can only be applied to fields and properties.
- To force-include a member in
PrintMembers, you should either use[PrintMembers]or[PrintMembers(ShouldInclude = true)]. - To force-exclude a member in
PrintMembers, you should use[PrintMembers(ShouldInclude = false)].
Currently, positional record parameters are not supported. Support for them should be added soon through targeted attributes:
[property: PrintMembers(ShouldInclude = false)]See this comment on dotnet/csharplang#3644.
- If the semantics of the added attribute is the same as what the compiler does, the generator ignores the attribute.
- The record must be partial to allow the source generator to re-define
PrintMembers.