RSCG – MemberAccessor
RSCG – MemberAccessor
name | MemberAccessor |
nuget | https://www.nuget.org/packages/BunnyTail.MemberAccessor/ |
link | https://github.com/usausa/member-accessor-generator |
author | Yamaokuno |
Generate getter and setter for class members.
This is how you can use MemberAccessor .
The code that you start with is
<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>
The code that you will use is
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));
using BunnyTail.MemberAccessor; namespace DemoMember; [GenerateAccessor] internal class Person { public string FirstName { get; set; }=string.Empty; }
The code that is generated is
// <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; } }
Code and pdf at https://ignatandrei.github.io/RSCG_Examples/v2/docs/MemberAccessor
Leave a Reply