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