MemberAccessor by Yamaokuno
NuGet / site data
Details
Info
Name: MemberAccessor
Member accessor code generator.
Author: Yamaokuno
NuGet: https://www.nuget.org/packages/BunnyTail.MemberAccessor/
You can find more details at https://github.com/usausa/member-accessor-generator
Original Readme
BunnyTail.MemberAccessor
Reference
Add reference to BunnyTail.MemberAccessor to csproj.
<ItemGroup>
<PackageReference Include="BunnyTail.MemberAccessor" Version="1.2.0" />
</ItemGroup>
MemberAccessor
Source
using BunnyTail.MemberAccessor;
[GenerateAccessor]
public partial class Data
{
public int Id { get; set; }
public string Name { get; set; } = default!;
}
using BunnyTail.MemberAccessor;
var accessorFactory = AccessorRegistry.FindFactory<Data>();
var getter = accessorFactory.CreateGetter<int>(nameof(Data.Id));
var setter = accessorFactory.CreateSetter<int>(nameof(Data.Id));
var data = new Data();
setter(data, 123);
var id = getter(data);
Benchmark
BenchmarkDotNet v0.14.0, Windows 11 (10.0.26100.2894)
AMD Ryzen 9 5900X, 1 CPU, 24 logical and 12 physical cores
.NET SDK 9.0.102
[Host] : .NET 9.0.1 (9.0.124.61010), X64 RyuJIT AVX2
DefaultJob : .NET 9.0.1 (9.0.124.61010), X64 RyuJIT AVX2
| Method | Mean | Error | StdDev | Min | Max | P90 | Code Size | Allocated |
|---|---|---|---|---|---|---|---|---|
| DirectGetter | 0.2180 ns | 0.0033 ns | 0.0027 ns | 0.2144 ns | 0.2231 ns | 0.2222 ns | 10 B | - |
| ExpressionGetter | 1.0868 ns | 0.0143 ns | 0.0134 ns | 1.0737 ns | 1.1127 ns | 1.1095 ns | 54 B | - |
| GeneratorGetter | 0.2244 ns | 0.0020 ns | 0.0019 ns | 0.2219 ns | 0.2283 ns | 0.2269 ns | 72 B | - |
| DirectSetter | 0.2155 ns | 0.0009 ns | 0.0008 ns | 0.2138 ns | 0.2167 ns | 0.2165 ns | 28 B | - |
| ExpressionSetter | 1.0956 ns | 0.0219 ns | 0.0225 ns | 1.0716 ns | 1.1393 ns | 1.1260 ns | 57 B | - |
| GeneratorSetter | 0.4306 ns | 0.0014 ns | 0.0012 ns | 0.4284 ns | 0.4328 ns | 0.4323 ns | 80 B | - |
About
Generate getter and setter for class members.
How to use
Example (source csproj, source files)
- CSharp Project
- Program.cs
- Person.cs
This is the CSharp Project that references MemberAccessor
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net9.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="BunnyTail.MemberAccessor" Version="1.2.0" />
</ItemGroup>
<PropertyGroup>
<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
<CompilerGeneratedFilesOutputPath>$(BaseIntermediateOutputPath)\GX</CompilerGeneratedFilesOutputPath>
</PropertyGroup>
</Project>
This is the use of MemberAccessor in Program.cs
using BunnyTail.MemberAccessor;
using DemoMember;
var accessorFactory = AccessorRegistry.FindFactory<Person>();
ArgumentNullException.ThrowIfNull(accessorFactory);
var getter = accessorFactory.CreateGetter<string>(nameof(Person.FirstName));
var setter = accessorFactory.CreateSetter<string>(nameof(Person.FirstName));
ArgumentNullException.ThrowIfNull(getter);
ArgumentNullException.ThrowIfNull(setter);
var p= new Person();
setter(p, "andrei");
Console.WriteLine(getter(p));
This is the use of MemberAccessor in Person.cs
using BunnyTail.MemberAccessor;
namespace DemoMember;
[GenerateAccessor]
internal class Person
{
public string FirstName { get; set; }=string.Empty;
}
Generated Files
Those are taken from $(BaseIntermediateOutputPath)\GX
- AccessorInitializer.g.cs
- DemoMember_Person_Accessor.g.cs
// <auto-generated />
#nullable enable
internal static class AccessorFactoryInitializer
{
[global::System.Runtime.CompilerServices.ModuleInitializer]
public static void Initialize()
{
global::BunnyTail.MemberAccessor.AccessorRegistry.RegisterFactory(typeof(global::DemoMember.Person), typeof(global::DemoMember.Person_AccessorFactory));
}
}
// <auto-generated />
#nullable enable
namespace DemoMember;
internal sealed class Person_AccessorFactory : global::BunnyTail.MemberAccessor.IAccessorFactory<global::DemoMember.Person>
{
private static readonly global::System.Func<object, object?> ObjectFirstNameGetter = static x => ((global::DemoMember.Person)x).FirstName!;
private static readonly global::System.Action<object, object?> ObjectFirstNameSetter = static (x, v) => ((global::DemoMember.Person)x).FirstName = (string)v!;
private static readonly global::System.Func<global::DemoMember.Person, string> TypedFirstNameGetter = static x => x.FirstName;
private static readonly global::System.Action<global::DemoMember.Person, string> TypedFirstNameSetter = static (x, v) => x.FirstName = v;
public global::System.Func<object, object?>? CreateGetter(string name)
{
if (name == "FirstName") return ObjectFirstNameGetter;
return null;
}
public global::System.Action<object, object?>? CreateSetter(string name)
{
if (name == "FirstName") return ObjectFirstNameSetter;
return null;
}
public global::System.Func<global::DemoMember.Person, TProperty>? CreateGetter<TProperty>(string name)
{
if (name == "FirstName") return (global::System.Func<global::DemoMember.Person, TProperty>)(object)TypedFirstNameGetter;
return null;
}
public global::System.Action<global::DemoMember.Person, TProperty>? CreateSetter<TProperty>(string name)
{
if (name == "FirstName") return (global::System.Action<global::DemoMember.Person, TProperty>)(object)TypedFirstNameSetter;
return null;
}
}
Useful
Download Example (.NET C#)
Share MemberAccessor
https://ignatandrei.github.io/RSCG_Examples/v2/docs/MemberAccessor
aaa
Category "EnhancementClass" has the following generators:
1 ApparatusAOT
2023-04-16
2 AspectGenerator
2024-01-07
3 CommonCodeGenerator
2024-04-03
4 Comparison
2025-05-25
5 DudNet
2023-10-27
6 Enhanced.GetTypes
2024-09-17
7 FastGenericNew
2023-08-10
8 Immutype
2023-08-12
9 Ling.Audit
2023-12-12
10 Lombok.NET
2023-04-16
11 M31.FluentAPI
2023-08-25
12 MemberAccessor
2025-03-24
13 MemoryPack
2023-08-04
14 Meziantou.Polyfill
2023-10-10
15 Microsoft.Extensions.Logging
2023-04-16
16 Microsoft.Extensions.Options.Generators.OptionsValidatorGenerator
2023-11-17
17 Microsoft.Interop.JavaScript.JSImportGenerator 2023-04-16
18 OptionToStringGenerator
2024-02-15
19 Program
2025-11-06
20 QueryStringGenerator
2024-11-07
21 RSCG_Decorator
2023-09-30
22 RSCG_UtilityTypes
2023-12-22
23 StaticReflection
2023-10-13
24 SyncMethodGenerator
2023-08-14
25 System.Runtime.InteropServices
2023-04-16
26 System.Text.RegularExpressions
2023-04-16
27 TelemetryLogging
2023-11-30
28 ThisClass
2024-04-19