RSCG – ApparatusAOT
RSCG – ApparatusAOT
name | ApparatusAOT |
nuget | https://www.nuget.org/packages/Apparatus.AOT.Reflection/ |
link | https://github.com/byme8/Apparatus.AOT.Reflection |
author | Stanislav Silin |
This will generate code for investigating at runtime the properties of an object
This is how you can use ApparatusAOT .
The code that you start with is
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net7.0</TargetFramework> </PropertyGroup> <ItemGroup> <PackageReference Include="Apparatus.AOT.Reflection" Version="0.2.0" /> </ItemGroup> <PropertyGroup> <EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles> <CompilerGeneratedFilesOutputPath>$(BaseIntermediateOutputPath)\GX</CompilerGeneratedFilesOutputPath> </PropertyGroup> </Project>
The code that you will use is
using Apparatus.AOT.Reflection; using ApparatusDemo; using System; Person p1 = new(); p1.FirstName = "Andrei1"; p1.LastName = "Ignat1"; Person p2 = new (); p2.FirstName = "Andrei2"; p2.LastName = "Ignat2"; var prop =p1.GetProperties().Values; foreach (var item in prop) { Console.WriteLine($"{item.Name} Attr: {item.Attributes.Length} value {item.Name}"); if (item.TryGetValue(p1, out var val)) { Console.WriteLine("value : " + val); } } foreach (var item in prop) { Console.WriteLine($"{item.Name} Attr: {item.Attributes.Length} value {item.Name}"); if (item.TryGetValue(p2, out var val)) { Console.WriteLine("value : " + val); } }
using System.ComponentModel.DataAnnotations; namespace ApparatusDemo; class Person { [Required] public string FirstName { get; set; } public string LastName { get; set; } }
The code that is generated is
using System; using System.Linq; namespace Apparatus.AOT.Reflection { public static class ApparatusDemo_PersonExtensions { [global::System.Runtime.CompilerServices.ModuleInitializer] public static void Bootstrap() { MetadataStore<global::ApparatusDemo.Person>.Data = _lazy; } private static global::System.Lazy<global::System.Collections.Generic.IReadOnlyDictionary<string, IPropertyInfo>> _lazy = new global::System.Lazy<global::System.Collections.Generic.IReadOnlyDictionary<string, IPropertyInfo>>(new global::System.Collections.Generic.Dictionary<string, IPropertyInfo> { { "FirstName", new global::Apparatus.AOT.Reflection.PropertyInfo<global::ApparatusDemo.Person,string>( "FirstName", new global::System.Attribute[] { new global::System.ComponentModel.DataAnnotations.RequiredAttribute(), }, instance => instance.FirstName, (instance, value) => instance.FirstName = value) }, { "LastName", new global::Apparatus.AOT.Reflection.PropertyInfo<global::ApparatusDemo.Person,string>( "LastName", new global::System.Attribute[] { }, instance => instance.LastName, (instance, value) => instance.LastName = value) }, }); internal static global::System.Collections.Generic.IReadOnlyDictionary<string, IPropertyInfo> GetProperties(this global::ApparatusDemo.Person value) { return _lazy.Value; } } }
Code and pdf at
https://ignatandrei.github.io/RSCG_Examples/v2/docs/ApparatusAOT
Leave a Reply