Rop.ProxyGenerator 1.0.28

dotnet add package Rop.ProxyGenerator --version 1.0.28
NuGet\Install-Package Rop.ProxyGenerator -Version 1.0.28
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Rop.ProxyGenerator" Version="1.0.28" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Rop.ProxyGenerator --version 1.0.28
#r "nuget: Rop.ProxyGenerator, 1.0.28"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install Rop.ProxyGenerator as a Cake Addin
#addin nuget:?package=Rop.ProxyGenerator&version=1.0.28

// Install Rop.ProxyGenerator as a Cake Tool
#tool nuget:?package=Rop.ProxyGenerator&version=1.0.28

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

There are no supported framework assets in this package.

Learn more about Target Frameworks and .NET Standard.

  • .NETStandard 2.0

    • No dependencies.

NuGet packages (7)

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.Windows7.Jedi

Helper classes for Winforms 7

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
1.0.28 178 7/14/2023
1.0.27 159 7/8/2023
1.0.26 133 7/8/2023
1.0.25 169 6/30/2023
1.0.24 172 6/30/2023
1.0.23 171 6/29/2023
1.0.22 342 12/1/2022
1.0.21 438 6/17/2022
1.0.20 395 6/17/2022
1.0.19 401 6/17/2022
1.0.18 397 6/17/2022
1.0.17 389 6/17/2022
1.0.16 402 6/16/2022
1.0.15 414 6/16/2022
1.0.14 402 6/16/2022
1.0.13 409 6/16/2022
1.0.12 378 6/15/2022
1.0.11 401 6/15/2022
1.0.10 382 6/15/2022
1.0.9 378 6/14/2022
1.0.8 396 6/14/2022
1.0.7 414 6/14/2022
1.0.6 416 6/14/2022
1.0.4 433 6/7/2022
1.0.3 419 6/6/2022
1.0.2 422 6/6/2022
1.0.1 410 6/3/2022