Rop.IncludeFrom 1.0.12

dotnet add package Rop.IncludeFrom --version 1.0.12                
NuGet\Install-Package Rop.IncludeFrom -Version 1.0.12                
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.IncludeFrom" Version="1.0.12" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Rop.IncludeFrom --version 1.0.12                
#r "nuget: Rop.IncludeFrom, 1.0.12"                
#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.IncludeFrom as a Cake Addin
#addin nuget:?package=Rop.IncludeFrom&version=1.0.12

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

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

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
1.0.12 111 9/6/2024
1.0.11 105 9/6/2024
1.0.10 109 9/4/2024
1.0.9 102 9/3/2024
1.0.8 104 9/3/2024
1.0.7 106 9/3/2024
1.0.6 101 9/3/2024
1.0.5 98 9/2/2024
1.0.4 101 9/2/2024
1.0.3 100 9/2/2024
1.0.2 115 9/2/2024