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