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