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