RSCG – ProxyGen
RSCG – ProxyGen
name | ProxyGen |
nuget | https://www.nuget.org/packages/ProxyGen.net/ |
link | https://github.com/Sholtee/ProxyGen |
author | Dénes Solti |
intercepting and duck typing
This is how you can use ProxyGen .
The code that you start with is
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net7.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> </PropertyGroup> <PropertyGroup> <EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles> <CompilerGeneratedFilesOutputPath>$(BaseIntermediateOutputPath)\GX</CompilerGeneratedFilesOutputPath> </PropertyGroup> <ItemGroup> <PackageReference Include="ProxyGen.NET" Version="8.2.1" /> </ItemGroup> </Project>
The code that you will use is
Person person = new (); person.FirstName= "Andrei"; person.LastName = "Ignat"; IPerson duck = DuckGenerator<IPerson, Person>.Activate(Tuple.Create(person)); Console.WriteLine(duck.FullName());
namespace ProxyGenDemo; public class Person { public int ID { get; set; } public string? FirstName { get; set; } public string? LastName { get; set; } public string FullName() { return $"{FirstName} {LastName}"; } }
namespace ProxyGenDemo; public interface IPerson { string? FirstName { get; set; } string? LastName { get; set; } string FullName(); }
global using ProxyGenDemo; global using Solti.Utils.Proxy.Generators; global using Solti.Utils.Proxy.Attributes; //[assembly: EmbedGeneratedType(typeof(ProxyGenerator<IMyInterface, MyInterceptor<IMyInterface>>))] [assembly: EmbedGeneratedType(typeof(DuckGenerator<IPerson, Person>))]
The code that is generated is
#pragma warning disable [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProxyGen.NET", "8.2.1.0"), global::System.Diagnostics.DebuggerNonUserCodeAttribute, global::System.Runtime.CompilerServices.CompilerGeneratedAttribute] internal sealed class Duck_BB1E45629CF5010E4068E5BFBB7EF53B : global::Solti.Utils.Proxy.Internals.DuckBase<global::ProxyGenDemo.Person>, global::ProxyGenDemo.IPerson { public Duck_BB1E45629CF5010E4068E5BFBB7EF53B(global::ProxyGenDemo.Person target) : base(target) { } [global::System.Runtime.CompilerServices.MethodImplAttribute(global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] global::System.String global::ProxyGenDemo.IPerson.FullName() => this.Target.FullName(); global::System.String global::ProxyGenDemo.IPerson.FirstName {[global::System.Runtime.CompilerServices.MethodImplAttribute(global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] get => this.Target.FirstName; [global::System.Runtime.CompilerServices.MethodImplAttribute(global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] set => this.Target.FirstName = value; } global::System.String global::ProxyGenDemo.IPerson.LastName {[global::System.Runtime.CompilerServices.MethodImplAttribute(global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] get => this.Target.LastName; [global::System.Runtime.CompilerServices.MethodImplAttribute(global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] set => this.Target.LastName = value; } public static readonly global::System.Func<global::System.Object, global::System.Object> __Activator = tuple => { switch (tuple) { case global::System.Tuple<global::ProxyGenDemo.Person> t0: return new global::Duck_BB1E45629CF5010E4068E5BFBB7EF53B(t0.Item1); default: throw new global::System.MissingMethodException("Constructor with the given layout cannot be found."); } }; [global::System.Runtime.CompilerServices.ModuleInitializerAttribute] public static void Initialize() => global::Solti.Utils.Proxy.Internals.LoadedTypes.Register(typeof(global::Duck_BB1E45629CF5010E4068E5BFBB7EF53B)); }
Code and pdf at
https://ignatandrei.github.io/RSCG_Examples/v2/docs/ProxyGen
Leave a Reply