Rop.ProxyGenerator
1.0.30
dotnet add package Rop.ProxyGenerator --version 1.0.30
NuGet\Install-Package Rop.ProxyGenerator -Version 1.0.30
<PackageReference Include="Rop.ProxyGenerator" Version="1.0.30" />
paket add Rop.ProxyGenerator --version 1.0.30
#r "nuget: Rop.ProxyGenerator, 1.0.30"
// Install Rop.ProxyGenerator as a Cake Addin #addin nuget:?package=Rop.ProxyGenerator&version=1.0.30 // Install Rop.ProxyGenerator as a Cake Tool #tool nuget:?package=Rop.ProxyGenerator&version=1.0.30
Rop.ProxyGenerator
Features
Rop.ProxyGenerator is a source generator package to automatic proxy of interfaces. It can be used to provide Aspect Oriented Programming to c# via a "proxy".
The package is published in nuget as 'Rop.ProxyGenerator'
Example:
I want to add to any winform control a "IControlValue" standard interface.
public interface IControlValue<T>
{
event EventHandler ControlValueChanged;
[Exclude]
T ControlValue { get; set; }
}
The interface has a common implementation but C# can't allow multiple inheritance.
To allow inject IControlValue logic to any winform control we derive a control with this syntax:
[ProxyOf("IControlValue<int>", nameof(_controlValueProxy))]
public partial class TextBoxValue : TextBox, IControlValue<int>
{
private readonly IControlValue<int> _controlValueProxy;
public TextBoxValue()
{
_controlValueProxy = new TextBoxValueAop(this);
}
private class TextBoxValueAop : ControlValueAop<TextBoxValue, int>
{
public TextBoxValueAop(TextBoxValue parent) : base(parent){}
}
}
The constructor creates the adapted logic to our class. That logic will be automaticly injected to code via rop.proxygenerator. The source generator.
The generated code will be a proxy for each IControlValue member.
// Autogenerated code for Proxy class
public partial class TextBoxValue
{
public event EventHandler ControlValueChanged{
add=>_controlValueProxy.ControlValueChanged+=value;
remove=>_controlValueProxy.ControlValueChanged-=value;
}
public virtual void OnControlValueChanged()
{
_controlValueProxy.OnControlValueChanged();
}
// Symbol 'ControlValue' excluded
}
I can "exclude" a member to force his declaration via attributes. In this case. "ControlValue" depends of the type of the control. So, I must hard code in my class
public partial class TextBoxValue{
public virtual int ControlValue
{
get => int.TryParse(base.Text, out int v) ? v : -1;
set => base.Text = value.ToString();
}
}
The ASPECT code to incorporate as proxy is derived from a abstract common logic of type ControlValueAOP
public abstract class ControlValueAop<C, T> : IControlValue<T> where C : Control, IControlValue<T>
{
public C Parent { get; }
public event EventHandler ControlValueChanged;
public virtual void OnControlValueChanged()
{
ControlValueChanged?.Invoke(this.Parent, EventArgs.Empty);
}
public virtual T ControlValue
{
get => this.Parent.ControlValue;
set => this.Parent.ControlValue = value;
}
protected ControlValueAop(C parent)
{
this.Parent = parent;
}
}
Rop.ProxyGenerator.Annotations
Attibutes to decorate a class to contain a proxy.
[AttributeUsage(AttributeTargets.Class)]
public class ProxyOfAttribute:Attribute
{
...
public ProxyOfAttribute(Type interfacename, string fieldname,string[] exclude=null)
{
...
}
}
Attibutes to include other attributes defined in an interface
public class IncludeNextAttributesAttribute : System.Attribute {}
Attribute to Exclude a Member
public class ExcludeAttribute : Attribute { }
Attibutes to Override Members
public class OverrideNewAttribute : Attribute { }
public class OverrideNoBaseAttribute : Attribute { }
public class OverrideWithPreBaseAttribute : Attribute { }
public class OverrideWithPostBaseAttribute : Attribute { }
Attributes to force Explicit Implementation of Proxy Interface
public class ExplicitAttribute : Attribute { }
public class ExplicitOverrideNoBaseAttribute : Attribute { }
public class ExplicitOverrideWithPreBaseAttribute : Attribute { }
public class ExplicitOverrideWithPostBaseAttribute : Attribute { }
Rop.ProxyGenerator
The source generator that create the proxy as partial class. Must be included as:
- OutputItemType="Analyzer"
- ReferenceOutputAssembly="false"
(C)2022 Ramón Ordiales Plaza
Learn more about Target Frameworks and .NET Standard.
-
.NETStandard 2.0
- No dependencies.
NuGet packages (8)
Showing the top 5 NuGet packages that depend on Rop.ProxyGenerator:
Package | Downloads |
---|---|
Rop.Winforms.KeyValueListComboBox
Create KeyValue ListBox and ComboBox |
|
Rop.Winforms.ListComboBox
Create compatible Items form ListBox and ComboBox |
|
Rop.Winforms.ControlValue
Create Control with value |
|
Rop.Winforms7.ControlValue
Helper classes for Winforms 7 |
|
Rop.Winforms8.ListComboBox
Create compatible Items form ListBox and ComboBox |
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
1.0.30 | 135 | 5/15/2024 |
1.0.29 | 112 | 5/15/2024 |
1.0.28 | 221 | 7/14/2023 |
1.0.27 | 193 | 7/8/2023 |
1.0.26 | 169 | 7/8/2023 |
1.0.25 | 205 | 6/30/2023 |
1.0.24 | 204 | 6/30/2023 |
1.0.23 | 203 | 6/29/2023 |
1.0.22 | 451 | 12/1/2022 |
1.0.21 | 483 | 6/17/2022 |
1.0.20 | 427 | 6/17/2022 |
1.0.19 | 430 | 6/17/2022 |
1.0.18 | 429 | 6/17/2022 |
1.0.17 | 421 | 6/17/2022 |
1.0.16 | 430 | 6/16/2022 |
1.0.15 | 448 | 6/16/2022 |
1.0.14 | 433 | 6/16/2022 |
1.0.13 | 441 | 6/16/2022 |
1.0.12 | 407 | 6/15/2022 |
1.0.11 | 429 | 6/15/2022 |
1.0.10 | 412 | 6/15/2022 |
1.0.9 | 411 | 6/14/2022 |
1.0.8 | 428 | 6/14/2022 |
1.0.7 | 443 | 6/14/2022 |
1.0.6 | 447 | 6/14/2022 |
1.0.4 | 463 | 6/7/2022 |
1.0.3 | 450 | 6/6/2022 |
1.0.2 | 454 | 6/6/2022 |
1.0.1 | 443 | 6/3/2022 |