DispatchProxyAdvanced 2.0.10

dotnet add package DispatchProxyAdvanced --version 2.0.10
                    
NuGet\Install-Package DispatchProxyAdvanced -Version 2.0.10
                    
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="DispatchProxyAdvanced" Version="2.0.10" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="DispatchProxyAdvanced" Version="2.0.10" />
                    
Directory.Packages.props
<PackageReference Include="DispatchProxyAdvanced" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add DispatchProxyAdvanced --version 2.0.10
                    
#r "nuget: DispatchProxyAdvanced, 2.0.10"
                    
#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.
#:package DispatchProxyAdvanced@2.0.10
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=DispatchProxyAdvanced&version=2.0.10
                    
Install as a Cake Addin
#tool nuget:?package=DispatchProxyAdvanced&version=2.0.10
                    
Install as a Cake Tool

DispatchProxyAdvanced

Advanced runtime-proxy generation for .NET with support for interfaces, classes, and per-proxy state.

DispatchProxyAdvanced extends the standard DispatchProxy pattern and makes it easier to create dynamic proxy objects for interfaces, abstract classes, and concrete classes while keeping custom state on each proxy instance.

Features

  • Proxy interfaces and classes at runtime
  • Create proxies from virtual members without writing a custom implementation class
  • Forward calls to a source instance for class-based scenarios
  • Attach custom state to each generated proxy instance
  • Useful for logging, instrumentation, validation, caching, and interception patterns

Quick start

1) Interface proxying

using DispatchProxyAdvanced;

public interface IExampleInterface
{
    int MyProp { get; set; }
    int MyMethod(int a, int b);
}

var proxy = ProxyFactory.Create<IExampleInterface>((method, args) =>
{
    Console.WriteLine($"Executing method: {method.Name}, args: {string.Join(", ", args)}");
    return args.FirstOrDefault();
});

proxy.MyProp = 222;
proxy.MyMethod(20, 200);

// Console output:
// Executing method: set_MyProp, args: 222
// Executing method: MyMethod, args: 20, 200

This is useful when you need to intercept interface calls without implementing a dedicated proxy class.

2) Class proxying with a source instance

using DispatchProxyAdvanced;

public class ExampleClass
{
    public virtual int MyProp { get; set; }
    public virtual int MyMethod(int a, int b) => a * b;
}

var someInstance = new ExampleClass { MyProp = 111 };

var proxy = ProxyFactory.CreateSourced(someInstance, (source, method, args) =>
{
    Console.WriteLine($"Executing method: {method.Name}, with args: {string.Join(", ", args)}");
    return method.Invoke(source, args);
});

Console.WriteLine($"Property value: {proxy.MyProp}");
Console.WriteLine($"Method result: {proxy.MyMethod(10, 100)}");

// Console output: 
// Executing method: get_MyProp, with args:
// Property value: 111
// Executing method: MyMethod, with args: 10, 100
// Method result: 1000

The generated proxy delegates virtual calls to the original instance while allowing interception logic around them.

3) Custom proxy state

var proxy = ProxyFactory.CreateSourced(someInstance, (source, proxy, method, args) =>
{
    // set your custom state to proxy instance
    proxy.CustomProxyStateDefinition = "ExampleStateValue";

    Console.WriteLine($"Executing method: {method.Name}");
    return method.Invoke(source, args);
});

Console.WriteLine($"Start proxy state: '{((IProxy)proxy).CustomProxyStateDefinition}'");

proxy.MyMethod(10, 100);

Console.WriteLine($"Current proxy state: '{((IProxy)proxy).CustomProxyStateDefinition}'");

// Console output: 
// Start proxy state: ''
// Executing method: MyMethod
// Current proxy state: 'ExampleStateValue'

Each proxy instance can carry its own custom state through the IProxy interface.

Why use it?

This library is useful when you need interception or decoration without manually writing a proxy type. Common scenarios include:

  • logging and diagnostics
  • method tracing
  • validation or policy checks
  • introducing cross-cutting behavior in a lightweight way
  • dynamic runtime wrappers for interfaces and classes

Example project

See the sample application in Examples/Program.cs.

License

This project is licensed under the MIT License.

Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 is compatible.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 is compatible.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 is compatible.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed.  net11.0 is compatible. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 is compatible. 
.NET Framework net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • .NETStandard 2.0

  • .NETStandard 2.1

    • No dependencies.
  • net10.0

    • No dependencies.
  • net11.0

    • No dependencies.
  • net6.0

    • No dependencies.
  • net7.0

    • No dependencies.
  • net8.0

    • No dependencies.
  • net9.0

    • No dependencies.

NuGet packages (4)

Showing the top 4 NuGet packages that depend on DispatchProxyAdvanced:

Package Downloads
OverridableDependencyInjection

Overridable injections for Microsoft.Extensions.DependencyInjection

ServiceProviderEndpoint.Client

ServiceProviderEndpoint Client

ContravarianceDependencyInjection

Contravariant and Covariant injection for Microsoft.Extensions.DependencyInjection

LazyDependencyInjection

Lazy injection for Microsoft.Extensions.DependencyInjection. Decorates registered services with lazy proxies that instantiate the original service only after the first method or property call. Intended to prevent the creation of unused injected dependencies.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
2.0.10 56 11/12/2026
2.0.9 800 2/11/2026
2.0.8 15,810 11/16/2024
2.0.7 587 10/27/2024
2.0.6 320 10/24/2024
2.0.5 282 10/24/2024
2.0.4 330 10/23/2024
2.0.3 399 10/23/2024 2.0.3 is deprecated because it has critical bugs.
1.1.0 424 1/12/2024
1.0.1 2,356 11/9/2022
1.0.0 795 11/5/2022
0.9.0 579 11/5/2022