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
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 | < 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
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | 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); } } |
1 2 3 4 5 6 7 8 | 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
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | 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