RSCG – TypedSignalR.Client

RSCG – TypedSignalR.Client
 
 

name TypedSignalR.Client
nuget https://www.nuget.org/packages/TypedSignalR.Client/
link https://github.com/nenoNaninu/TypedSignalR.Client
author nenoNaninu

Creating typed Signal R clients

 

This is how you can use TypedSignalR.Client .

The code that you start with is


<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net8.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>

	<ItemGroup>
		<PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="6.0.1" />
		<PackageReference Include="TypedSignalR.Client" Version="3.6.0">
		  <PrivateAssets>all</PrivateAssets>
		  <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
		</PackageReference>
	</ItemGroup>

	<ItemGroup>
	  <ProjectReference Include="..\TestSignalRCommon\TestSignalRCommon.csproj" />
	</ItemGroup>

	<PropertyGroup>
		<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
		<CompilerGeneratedFilesOutputPath>$(BaseIntermediateOutputPath)\GX</CompilerGeneratedFilesOutputPath>
	</PropertyGroup>
	
</Project>


The code that you will use is


// See https://aka.ms/new-console-template for more information
using Microsoft.AspNetCore.SignalR.Client;
using TestSignalRCommon;
using TestSignalRConsole;

Console.WriteLine("Hello,World!");
await Task.Delay(5_000);
HubConnection _connection = new HubConnectionBuilder()
    .WithUrl("https://localhost:7302/ChatHub")
    .Build();
await _connection.StartAsync();

_connection.On<string,string>("ReceiveMessage",(user,message) =>
{
    Console.WriteLine($" from not typed {user}: {message}");
});

await Task.Delay(30_000);
var h = TypedSignalR.Client.HubConnectionExtensions.CreateHubProxy<IHubMessage>(_connection);
await h.SendMessage("console","message");
//TypedSignalR.Client.HubConnectionExtensions.Register<IHubMessage>(_connection,new ReceiverMessage());

Console.WriteLine("waiting for messages from Windows App");
var message = Console.ReadLine();




 

The code that is generated is

// <auto-generated>
// THIS (.cs) FILE IS GENERATED BY TypedSignalR.Client
// </auto-generated>
#nullable enable
#pragma warning disable CS1591
namespace TypedSignalR.Client
{
    internal interface IHubConnectionObserver
    {
        global::System.Threading.Tasks.Task OnClosed(global::System.Exception? exception);
        global::System.Threading.Tasks.Task OnReconnected(string? connectionId);
        global::System.Threading.Tasks.Task OnReconnecting(global::System.Exception? exception);
    }

    internal interface IHubInvoker
    {
    }

    internal interface IHubInvokerFactory
    {
    }

    internal interface IHubInvokerFactory<out T> : IHubInvokerFactory
    {
        T CreateHubInvoker(global::Microsoft.AspNetCore.SignalR.Client.HubConnection connection,global::System.Threading.CancellationToken cancellationToken);
    }

    internal interface IReceiverBinder
    {
    }

    internal interface IReceiverBinder<in T> : IReceiverBinder
    {
        global::System.IDisposable Bind(global::Microsoft.AspNetCore.SignalR.Client.HubConnection connection,T receiver);
    }
}
#pragma warning restore CS1591

// <auto-generated>
// THIS (.cs) FILE IS GENERATED BY TypedSignalR.Client
// </auto-generated>
#nullable enable
#pragma warning disable CS1591
#pragma warning disable CS8767
#pragma warning disable CS8613
namespace TypedSignalR.Client
{
    internal static partial class HubConnectionExtensions
    {
        private static partial global::System.Collections.Generic.Dictionary<global::System.Type,IReceiverBinder> CreateBinders()
        {
            var binders = new global::System.Collections.Generic.Dictionary<global::System.Type,IReceiverBinder>();


            return binders;
        }
    }
}
#pragma warning restore CS8613
#pragma warning restore CS8767
#pragma warning restore CS1591

// <auto-generated>
// THIS (.cs) FILE IS GENERATED BY TypedSignalR.Client
// </auto-generated>
#nullable enable
#pragma warning disable CS1591
namespace TypedSignalR.Client
{
    internal static partial class HubConnectionExtensions
    {
        public static THub CreateHubProxy<THub>(this global::Microsoft.AspNetCore.SignalR.Client.HubConnection connection,global::System.Threading.CancellationToken cancellationToken = default)
        {
            var factory = HubInvokerFactoryProvider.GetHubInvokerFactory<THub>();

            if (factory is null)
            {
                throw new global::System.InvalidOperationException($"Failed to create a hub proxy. TypedSignalR.Client did not generate source code to create a hub proxy,which type is {typeof(THub)}.");
            }

            return factory.CreateHubInvoker(connection,cancellationToken);
        }

        public static global::System.IDisposable Register<TReceiver>(this global::Microsoft.AspNetCore.SignalR.Client.HubConnection connection,TReceiver receiver)
        {
            if (receiver is null)
            {
                throw new global::System.ArgumentNullException(nameof(receiver));
            }

            if (typeof(TReceiver) == typeof(IHubConnectionObserver))
            {
                return new HubConnectionObserverSubscription(connection,(IHubConnectionObserver)receiver);
            }

            var binder = ReceiverBinderProvider.GetReceiverBinder<TReceiver>();

            if (binder is null)
            {
                throw new global::System.InvalidOperationException($"Failed to register a receiver. TypedSignalR.Client did not generate source code to register a receiver,which type is {typeof(TReceiver)}.");
            }

            var subscription = binder.Bind(connection,receiver);

            if (receiver is IHubConnectionObserver hubConnectionObserver)
            {
                subscription = new CompositeDisposable(new[] { subscription,new HubConnectionObserverSubscription(connection,hubConnectionObserver) });
            }

            return subscription;
        }
    }

    internal static partial class HubConnectionExtensions
    {
        private static partial global::System.Collections.Generic.Dictionary<global::System.Type,IHubInvokerFactory> CreateFactories();
        private static partial global::System.Collections.Generic.Dictionary<global::System.Type,IReceiverBinder> CreateBinders();

        private static class HubInvokerFactoryProvider
        {
            private static readonly global::System.Collections.Generic.Dictionary<global::System.Type,IHubInvokerFactory> Factories;

            static HubInvokerFactoryProvider()
            {
                Factories = CreateFactories();
            }

            public static IHubInvokerFactory<T>? GetHubInvokerFactory<T>()
            {
                return Cache<T>.HubInvokerFactory;
            }

            private static class Cache<T>
            {
                public static readonly IHubInvokerFactory<T>? HubInvokerFactory = default;

                static Cache()
                {
                    if (Factories.TryGetValue(typeof(T),out var hubInvokerFactory))
                    {
                        HubInvokerFactory = hubInvokerFactory as IHubInvokerFactory<T>;
                    }
                }
            }
        }

        private static class ReceiverBinderProvider
        {
            private static readonly global::System.Collections.Generic.Dictionary<global::System.Type,IReceiverBinder> Binders;

            static ReceiverBinderProvider()
            {
                Binders = CreateBinders();
            }

            public static IReceiverBinder<T>? GetReceiverBinder<T>()
            {
                return Cache<T>.ReceiverBinder;
            }

            private static class Cache<T>
            {
                public static readonly IReceiverBinder<T>? ReceiverBinder = default;

                static Cache()
                {
                    if (Binders.TryGetValue(typeof(T),out var receiverBinder))
                    {
                        ReceiverBinder = receiverBinder as IReceiverBinder<T>;
                    }
                }
            }
        }

        private sealed class HubConnectionObserverSubscription : global::System.IDisposable
        {
            private readonly global::Microsoft.AspNetCore.SignalR.Client.HubConnection _connection;
            private readonly IHubConnectionObserver _hubConnectionObserver;

            private int _disposed = 0;

            public HubConnectionObserverSubscription(global::Microsoft.AspNetCore.SignalR.Client.HubConnection connection,IHubConnectionObserver hubConnectionObserver)
            {
                _connection = connection;
                _hubConnectionObserver = hubConnectionObserver;

                _connection.Closed += hubConnectionObserver.OnClosed;
                _connection.Reconnected += hubConnectionObserver.OnReconnected;
                _connection.Reconnecting += hubConnectionObserver.OnReconnecting;
            }

            public void Dispose()
            {
                if (global::System.Threading.Interlocked.Exchange(ref _disposed,1) == 0)
                {
                    _connection.Closed -= _hubConnectionObserver.OnClosed;
                    _connection.Reconnected -= _hubConnectionObserver.OnReconnected;
                    _connection.Reconnecting -= _hubConnectionObserver.OnReconnecting;
                }
            }
        }

        private sealed class CompositeDisposable : global::System.IDisposable
        {
            private readonly object _gate = new object();
            private readonly global::System.Collections.Generic.List<global::System.IDisposable> _disposables;

            private bool _disposed;

            public CompositeDisposable()
            {
                _disposables = new global::System.Collections.Generic.List<global::System.IDisposable>();
            }

            public CompositeDisposable(global::System.IDisposable[] disposables)
            {
                _disposables = new global::System.Collections.Generic.List<global::System.IDisposable>(disposables);
            }

            public CompositeDisposable(int capacity)
            {
                if (capacity < 0)
                {
                    throw new global::System.ArgumentOutOfRangeException(nameof(capacity));
                }

                _disposables = new global::System.Collections.Generic.List<global::System.IDisposable>(capacity);
            }

            public void Add(global::System.IDisposable item)
            {
                bool shouldDispose = false;

                lock (_gate)
                {
                    shouldDispose = _disposed;

                    if (!_disposed)
                    {
                        _disposables.Add(item);
                    }
                }

                if (shouldDispose)
                {
                    item.Dispose();
                }
            }

            public void Dispose()
            {
                var currentDisposables = default(global::System.Collections.Generic.List<global::System.IDisposable>);

                lock (_gate)
                {
                    if (_disposed)
                    {
                        return;
                    }

                    _disposed = true;
                    currentDisposables = _disposables;
                }

                foreach (var item in currentDisposables)
                {
                    if (item is not null)
                    {
                        item.Dispose();
                    }
                }

                currentDisposables.Clear();
            }
        }

        // It is not possible to avoid boxing.
        // This is a limitation caused by the SignalR implementation.
        private static class HandlerConverter
        {
            public static global::System.Func<object?[],global::System.Threading.Tasks.Task> Convert(global::System.Func<global::System.Threading.Tasks.Task> handler)
            {
                return args => handler();
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task> Convert<T1>(global::System.Func<T1,global::System.Threading.Tasks.Task> handler)
            {
                return args => handler((T1)args[0]!);
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task> Convert<T1,T2>(global::System.Func<T1,T2,global::System.Threading.Tasks.Task> handler)
            {
                return args => handler((T1)args[0]!,(T2)args[1]!);
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task> Convert<T1,T2,T3>(global::System.Func<T1,T2,T3,global::System.Threading.Tasks.Task> handler)
            {
                return args => handler((T1)args[0]!,(T2)args[1]!,(T3)args[2]!);
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task> Convert<T1,T2,T3,T4>(global::System.Func<T1,T2,T3,T4,global::System.Threading.Tasks.Task> handler)
            {
                return args => handler((T1)args[0]!,(T2)args[1]!,(T3)args[2]!,(T4)args[3]!);
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task> Convert<T1,T2,T3,T4,T5>(global::System.Func<T1,T2,T3,T4,T5,global::System.Threading.Tasks.Task> handler)
            {
                return args => handler((T1)args[0]!,(T2)args[1]!,(T3)args[2]!,(T4)args[3]!,(T5)args[4]!);
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task> Convert<T1,T2,T3,T4,T5,T6>(global::System.Func<T1,T2,T3,T4,T5,T6,global::System.Threading.Tasks.Task> handler)
            {
                return args => handler((T1)args[0]!,(T2)args[1]!,(T3)args[2]!,(T4)args[3]!,(T5)args[4]!,(T6)args[5]!);
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task> Convert<T1,T2,T3,T4,T5,T6,T7>(global::System.Func<T1,T2,T3,T4,T5,T6,T7,global::System.Threading.Tasks.Task> handler)
            {
                return args => handler((T1)args[0]!,(T2)args[1]!,(T3)args[2]!,(T4)args[3]!,(T5)args[4]!,(T6)args[5]!,(T7)args[6]!);
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task> Convert<T1,T2,T3,T4,T5,T6,T7,T8>(global::System.Func<T1,T2,T3,T4,T5,T6,T7,T8,global::System.Threading.Tasks.Task> handler)
            {
                return args => handler((T1)args[0]!,(T2)args[1]!,(T3)args[2]!,(T4)args[3]!,(T5)args[4]!,(T6)args[5]!,(T7)args[6]!,(T8)args[7]!);
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task> Convert<T1,T2,T3,T4,T5,T6,T7,T8,T9>(global::System.Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,global::System.Threading.Tasks.Task> handler)
            {
                return args => handler((T1)args[0]!,(T2)args[1]!,(T3)args[2]!,(T4)args[3]!,(T5)args[4]!,(T6)args[5]!,(T7)args[6]!,(T8)args[7]!,(T9)args[8]!);
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task> Convert<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10>(global::System.Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,global::System.Threading.Tasks.Task> handler)
            {
                return args => handler((T1)args[0]!,(T2)args[1]!,(T3)args[2]!,(T4)args[3]!,(T5)args[4]!,(T6)args[5]!,(T7)args[6]!,(T8)args[7]!,(T9)args[8]!,(T10)args[9]!);
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task> Convert<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11>(global::System.Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,global::System.Threading.Tasks.Task> handler)
            {
                return args => handler((T1)args[0]!,(T2)args[1]!,(T3)args[2]!,(T4)args[3]!,(T5)args[4]!,(T6)args[5]!,(T7)args[6]!,(T8)args[7]!,(T9)args[8]!,(T10)args[9]!,(T11)args[10]!);
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task> Convert<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12>(global::System.Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,global::System.Threading.Tasks.Task> handler)
            {
                return args => handler((T1)args[0]!,(T2)args[1]!,(T3)args[2]!,(T4)args[3]!,(T5)args[4]!,(T6)args[5]!,(T7)args[6]!,(T8)args[7]!,(T9)args[8]!,(T10)args[9]!,(T11)args[10]!,(T12)args[11]!);
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task> Convert<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13>(global::System.Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,global::System.Threading.Tasks.Task> handler)
            {
                return args => handler((T1)args[0]!,(T2)args[1]!,(T3)args[2]!,(T4)args[3]!,(T5)args[4]!,(T6)args[5]!,(T7)args[6]!,(T8)args[7]!,(T9)args[8]!,(T10)args[9]!,(T11)args[10]!,(T12)args[11]!,(T13)args[12]!);
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task> Convert<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14>(global::System.Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,global::System.Threading.Tasks.Task> handler)
            {
                return args => handler((T1)args[0]!,(T2)args[1]!,(T3)args[2]!,(T4)args[3]!,(T5)args[4]!,(T6)args[5]!,(T7)args[6]!,(T8)args[7]!,(T9)args[8]!,(T10)args[9]!,(T11)args[10]!,(T12)args[11]!,(T13)args[12]!,(T14)args[13]!);
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task> Convert<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15>(global::System.Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,global::System.Threading.Tasks.Task> handler)
            {
                return args => handler((T1)args[0]!,(T2)args[1]!,(T3)args[2]!,(T4)args[3]!,(T5)args[4]!,(T6)args[5]!,(T7)args[6]!,(T8)args[7]!,(T9)args[8]!,(T10)args[9]!,(T11)args[10]!,(T12)args[11]!,(T13)args[12]!,(T14)args[13]!,(T15)args[14]!);
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task> Convert<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16>(global::System.Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,global::System.Threading.Tasks.Task> handler)
            {
                return args => handler((T1)args[0]!,(T2)args[1]!,(T3)args[2]!,(T4)args[3]!,(T5)args[4]!,(T6)args[5]!,(T7)args[6]!,(T8)args[7]!,(T9)args[8]!,(T10)args[9]!,(T11)args[10]!,(T12)args[11]!,(T13)args[12]!,(T14)args[13]!,(T15)args[14]!,(T16)args[15]!);
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task> Convert(global::System.Func<global::System.Threading.CancellationToken,global::System.Threading.Tasks.Task> handler)
            {
                return args => handler(default);
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task> Convert<T1>(global::System.Func<T1,global::System.Threading.CancellationToken,global::System.Threading.Tasks.Task> handler)
            {
                return args => handler((T1)args[0]!,default);
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task> Convert<T1,T2>(global::System.Func<T1,T2,global::System.Threading.CancellationToken,global::System.Threading.Tasks.Task> handler)
            {
                return args => handler((T1)args[0]!,(T2)args[1]!,default);
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task> Convert<T1,T2,T3>(global::System.Func<T1,T2,T3,global::System.Threading.CancellationToken,global::System.Threading.Tasks.Task> handler)
            {
                return args => handler((T1)args[0]!,(T2)args[1]!,(T3)args[2]!,default);
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task> Convert<T1,T2,T3,T4>(global::System.Func<T1,T2,T3,T4,global::System.Threading.CancellationToken,global::System.Threading.Tasks.Task> handler)
            {
                return args => handler((T1)args[0]!,(T2)args[1]!,(T3)args[2]!,(T4)args[3]!,default);
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task> Convert<T1,T2,T3,T4,T5>(global::System.Func<T1,T2,T3,T4,T5,global::System.Threading.CancellationToken,global::System.Threading.Tasks.Task> handler)
            {
                return args => handler((T1)args[0]!,(T2)args[1]!,(T3)args[2]!,(T4)args[3]!,(T5)args[4]!,default);
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task> Convert<T1,T2,T3,T4,T5,T6>(global::System.Func<T1,T2,T3,T4,T5,T6,global::System.Threading.CancellationToken,global::System.Threading.Tasks.Task> handler)
            {
                return args => handler((T1)args[0]!,(T2)args[1]!,(T3)args[2]!,(T4)args[3]!,(T5)args[4]!,(T6)args[5]!,default);
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task> Convert<T1,T2,T3,T4,T5,T6,T7>(global::System.Func<T1,T2,T3,T4,T5,T6,T7,global::System.Threading.CancellationToken,global::System.Threading.Tasks.Task> handler)
            {
                return args => handler((T1)args[0]!,(T2)args[1]!,(T3)args[2]!,(T4)args[3]!,(T5)args[4]!,(T6)args[5]!,(T7)args[6]!,default);
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task> Convert<T1,T2,T3,T4,T5,T6,T7,T8>(global::System.Func<T1,T2,T3,T4,T5,T6,T7,T8,global::System.Threading.CancellationToken,global::System.Threading.Tasks.Task> handler)
            {
                return args => handler((T1)args[0]!,(T2)args[1]!,(T3)args[2]!,(T4)args[3]!,(T5)args[4]!,(T6)args[5]!,(T7)args[6]!,(T8)args[7]!,default);
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task> Convert<T1,T2,T3,T4,T5,T6,T7,T8,T9>(global::System.Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,global::System.Threading.CancellationToken,global::System.Threading.Tasks.Task> handler)
            {
                return args => handler((T1)args[0]!,(T2)args[1]!,(T3)args[2]!,(T4)args[3]!,(T5)args[4]!,(T6)args[5]!,(T7)args[6]!,(T8)args[7]!,(T9)args[8]!,default);
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task> Convert<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10>(global::System.Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,global::System.Threading.CancellationToken,global::System.Threading.Tasks.Task> handler)
            {
                return args => handler((T1)args[0]!,(T2)args[1]!,(T3)args[2]!,(T4)args[3]!,(T5)args[4]!,(T6)args[5]!,(T7)args[6]!,(T8)args[7]!,(T9)args[8]!,(T10)args[9]!,default);
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task> Convert<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11>(global::System.Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,global::System.Threading.CancellationToken,global::System.Threading.Tasks.Task> handler)
            {
                return args => handler((T1)args[0]!,(T2)args[1]!,(T3)args[2]!,(T4)args[3]!,(T5)args[4]!,(T6)args[5]!,(T7)args[6]!,(T8)args[7]!,(T9)args[8]!,(T10)args[9]!,(T11)args[10]!,default);
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task> Convert<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12>(global::System.Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,global::System.Threading.CancellationToken,global::System.Threading.Tasks.Task> handler)
            {
                return args => handler((T1)args[0]!,(T2)args[1]!,(T3)args[2]!,(T4)args[3]!,(T5)args[4]!,(T6)args[5]!,(T7)args[6]!,(T8)args[7]!,(T9)args[8]!,(T10)args[9]!,(T11)args[10]!,(T12)args[11]!,default);
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task> Convert<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13>(global::System.Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,global::System.Threading.CancellationToken,global::System.Threading.Tasks.Task> handler)
            {
                return args => handler((T1)args[0]!,(T2)args[1]!,(T3)args[2]!,(T4)args[3]!,(T5)args[4]!,(T6)args[5]!,(T7)args[6]!,(T8)args[7]!,(T9)args[8]!,(T10)args[9]!,(T11)args[10]!,(T12)args[11]!,(T13)args[12]!,default);
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task> Convert<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14>(global::System.Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,global::System.Threading.CancellationToken,global::System.Threading.Tasks.Task> handler)
            {
                return args => handler((T1)args[0]!,(T2)args[1]!,(T3)args[2]!,(T4)args[3]!,(T5)args[4]!,(T6)args[5]!,(T7)args[6]!,(T8)args[7]!,(T9)args[8]!,(T10)args[9]!,(T11)args[10]!,(T12)args[11]!,(T13)args[12]!,(T14)args[13]!,default);
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task> Convert<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15>(global::System.Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,global::System.Threading.CancellationToken,global::System.Threading.Tasks.Task> handler)
            {
                return args => handler((T1)args[0]!,(T2)args[1]!,(T3)args[2]!,(T4)args[3]!,(T5)args[4]!,(T6)args[5]!,(T7)args[6]!,(T8)args[7]!,(T9)args[8]!,(T10)args[9]!,(T11)args[10]!,(T12)args[11]!,(T13)args[12]!,(T14)args[13]!,(T15)args[14]!,default);
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task<TResult>> Convert<TResult>(global::System.Func<global::System.Threading.Tasks.Task<TResult>> handler)
            {
                return async args =>
                {
                    var result = await handler().ConfigureAwait(false);
                    return result;
                };
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task<TResult>> Convert<T1,TResult>(global::System.Func<T1,global::System.Threading.Tasks.Task<TResult>> handler)
            {
                return async args =>
                {
                    var result = await handler((T1)args[0]!).ConfigureAwait(false);
                    return result;
                };
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task<TResult>> Convert<T1,T2,TResult>(global::System.Func<T1,T2,global::System.Threading.Tasks.Task<TResult>> handler)
            {
                return async args =>
                {
                    var result = await handler((T1)args[0]!,(T2)args[1]!).ConfigureAwait(false);
                    return result;
                };
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task<TResult>> Convert<T1,T2,T3,TResult>(global::System.Func<T1,T2,T3,global::System.Threading.Tasks.Task<TResult>> handler)
            {
                return async args =>
                {
                    var result = await handler((T1)args[0]!,(T2)args[1]!,(T3)args[2]!).ConfigureAwait(false);
                    return result;
                };
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task<TResult>> Convert<T1,T2,T3,T4,TResult>(global::System.Func<T1,T2,T3,T4,global::System.Threading.Tasks.Task<TResult>> handler)
            {
                return async args =>
                {
                    var result = await handler((T1)args[0]!,(T2)args[1]!,(T3)args[2]!,(T4)args[3]!).ConfigureAwait(false);
                    return result;
                };
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task<TResult>> Convert<T1,T2,T3,T4,T5,TResult>(global::System.Func<T1,T2,T3,T4,T5,global::System.Threading.Tasks.Task<TResult>> handler)
            {
                return async args =>
                {
                    var result = await handler((T1)args[0]!,(T2)args[1]!,(T3)args[2]!,(T4)args[3]!,(T5)args[4]!).ConfigureAwait(false);
                    return result;
                };
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task<TResult>> Convert<T1,T2,T3,T4,T5,T6,TResult>(global::System.Func<T1,T2,T3,T4,T5,T6,global::System.Threading.Tasks.Task<TResult>> handler)
            {
                return async args =>
                {
                    var result = await handler((T1)args[0]!,(T2)args[1]!,(T3)args[2]!,(T4)args[3]!,(T5)args[4]!,(T6)args[5]!).ConfigureAwait(false);
                    return result;
                };
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task<TResult>> Convert<T1,T2,T3,T4,T5,T6,T7,TResult>(global::System.Func<T1,T2,T3,T4,T5,T6,T7,global::System.Threading.Tasks.Task<TResult>> handler)
            {
                return async args =>
                {
                    var result = await handler((T1)args[0]!,(T2)args[1]!,(T3)args[2]!,(T4)args[3]!,(T5)args[4]!,(T6)args[5]!,(T7)args[6]!).ConfigureAwait(false);
                    return result;
                };
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task<TResult>> Convert<T1,T2,T3,T4,T5,T6,T7,T8,TResult>(global::System.Func<T1,T2,T3,T4,T5,T6,T7,T8,global::System.Threading.Tasks.Task<TResult>> handler)
            {
                return async args =>
                {
                    var result = await handler((T1)args[0]!,(T2)args[1]!,(T3)args[2]!,(T4)args[3]!,(T5)args[4]!,(T6)args[5]!,(T7)args[6]!,(T8)args[7]!).ConfigureAwait(false);
                    return result;
                };
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task<TResult>> Convert<T1,T2,T3,T4,T5,T6,T7,T8,T9,TResult>(global::System.Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,global::System.Threading.Tasks.Task<TResult>> handler)
            {
                return async args =>
                {
                    var result = await handler((T1)args[0]!,(T2)args[1]!,(T3)args[2]!,(T4)args[3]!,(T5)args[4]!,(T6)args[5]!,(T7)args[6]!,(T8)args[7]!,(T9)args[8]!).ConfigureAwait(false);
                    return result;
                };
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task<TResult>> Convert<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,TResult>(global::System.Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,global::System.Threading.Tasks.Task<TResult>> handler)
            {
                return async args =>
                {
                    var result = await handler((T1)args[0]!,(T2)args[1]!,(T3)args[2]!,(T4)args[3]!,(T5)args[4]!,(T6)args[5]!,(T7)args[6]!,(T8)args[7]!,(T9)args[8]!,(T10)args[9]!).ConfigureAwait(false);
                    return result;
                };
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task<TResult>> Convert<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,TResult>(global::System.Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,global::System.Threading.Tasks.Task<TResult>> handler)
            {
                return async args =>
                {
                    var result = await handler((T1)args[0]!,(T2)args[1]!,(T3)args[2]!,(T4)args[3]!,(T5)args[4]!,(T6)args[5]!,(T7)args[6]!,(T8)args[7]!,(T9)args[8]!,(T10)args[9]!,(T11)args[10]!).ConfigureAwait(false);
                    return result;
                };
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task<TResult>> Convert<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,TResult>(global::System.Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,global::System.Threading.Tasks.Task<TResult>> handler)
            {
                return async args =>
                {
                    var result = await handler((T1)args[0]!,(T2)args[1]!,(T3)args[2]!,(T4)args[3]!,(T5)args[4]!,(T6)args[5]!,(T7)args[6]!,(T8)args[7]!,(T9)args[8]!,(T10)args[9]!,(T11)args[10]!,(T12)args[11]!).ConfigureAwait(false);
                    return result;
                };
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task<TResult>> Convert<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,TResult>(global::System.Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,global::System.Threading.Tasks.Task<TResult>> handler)
            {
                return async args =>
                {
                    var result = await handler((T1)args[0]!,(T2)args[1]!,(T3)args[2]!,(T4)args[3]!,(T5)args[4]!,(T6)args[5]!,(T7)args[6]!,(T8)args[7]!,(T9)args[8]!,(T10)args[9]!,(T11)args[10]!,(T12)args[11]!,(T13)args[12]!).ConfigureAwait(false);
                    return result;
                };
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task<TResult>> Convert<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,TResult>(global::System.Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,global::System.Threading.Tasks.Task<TResult>> handler)
            {
                return async args =>
                {
                    var result = await handler((T1)args[0]!,(T2)args[1]!,(T3)args[2]!,(T4)args[3]!,(T5)args[4]!,(T6)args[5]!,(T7)args[6]!,(T8)args[7]!,(T9)args[8]!,(T10)args[9]!,(T11)args[10]!,(T12)args[11]!,(T13)args[12]!,(T14)args[13]!).ConfigureAwait(false);
                    return result;
                };
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task<TResult>> Convert<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,TResult>(global::System.Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,global::System.Threading.Tasks.Task<TResult>> handler)
            {
                return async args =>
                {
                    var result = await handler((T1)args[0]!,(T2)args[1]!,(T3)args[2]!,(T4)args[3]!,(T5)args[4]!,(T6)args[5]!,(T7)args[6]!,(T8)args[7]!,(T9)args[8]!,(T10)args[9]!,(T11)args[10]!,(T12)args[11]!,(T13)args[12]!,(T14)args[13]!,(T15)args[14]!).ConfigureAwait(false);
                    return result;
                };
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task<TResult>> Convert<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,TResult>(global::System.Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,global::System.Threading.Tasks.Task<TResult>> handler)
            {
                return async args =>
                {
                    var result = await handler((T1)args[0]!,(T2)args[1]!,(T3)args[2]!,(T4)args[3]!,(T5)args[4]!,(T6)args[5]!,(T7)args[6]!,(T8)args[7]!,(T9)args[8]!,(T10)args[9]!,(T11)args[10]!,(T12)args[11]!,(T13)args[12]!,(T14)args[13]!,(T15)args[14]!,(T16)args[15]!).ConfigureAwait(false);
                    return result;
                };
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task<TResult>> Convert<TResult>(global::System.Func<global::System.Threading.CancellationToken,global::System.Threading.Tasks.Task<TResult>> handler)
            {
                return async args =>
                {
                    var result = await handler(default).ConfigureAwait(false);
                    return result;
                };
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task<TResult>> Convert<T1,TResult>(global::System.Func<T1,global::System.Threading.CancellationToken,global::System.Threading.Tasks.Task<TResult>> handler)
            {
                return async args =>
                {
                    var result = await handler((T1)args[0]!,default).ConfigureAwait(false);
                    return result;
                };
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task<TResult>> Convert<T1,T2,TResult>(global::System.Func<T1,T2,global::System.Threading.CancellationToken,global::System.Threading.Tasks.Task<TResult>> handler)
            {
                return async args =>
                {
                    var result = await handler((T1)args[0]!,(T2)args[1]!,default).ConfigureAwait(false);
                    return result;
                };
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task<TResult>> Convert<T1,T2,T3,TResult>(global::System.Func<T1,T2,T3,global::System.Threading.CancellationToken,global::System.Threading.Tasks.Task<TResult>> handler)
            {
                return async args =>
                {
                    var result = await handler((T1)args[0]!,(T2)args[1]!,(T3)args[2]!,default).ConfigureAwait(false);
                    return result;
                };
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task<TResult>> Convert<T1,T2,T3,T4,TResult>(global::System.Func<T1,T2,T3,T4,global::System.Threading.CancellationToken,global::System.Threading.Tasks.Task<TResult>> handler)
            {
                return async args =>
                {
                    var result = await handler((T1)args[0]!,(T2)args[1]!,(T3)args[2]!,(T4)args[3]!,default).ConfigureAwait(false);
                    return result;
                };
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task<TResult>> Convert<T1,T2,T3,T4,T5,TResult>(global::System.Func<T1,T2,T3,T4,T5,global::System.Threading.CancellationToken,global::System.Threading.Tasks.Task<TResult>> handler)
            {
                return async args =>
                {
                    var result = await handler((T1)args[0]!,(T2)args[1]!,(T3)args[2]!,(T4)args[3]!,(T5)args[4]!,default).ConfigureAwait(false);
                    return result;
                };
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task<TResult>> Convert<T1,T2,T3,T4,T5,T6,TResult>(global::System.Func<T1,T2,T3,T4,T5,T6,global::System.Threading.CancellationToken,global::System.Threading.Tasks.Task<TResult>> handler)
            {
                return async args =>
                {
                    var result = await handler((T1)args[0]!,(T2)args[1]!,(T3)args[2]!,(T4)args[3]!,(T5)args[4]!,(T6)args[5]!,default).ConfigureAwait(false);
                    return result;
                };
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task<TResult>> Convert<T1,T2,T3,T4,T5,T6,T7,TResult>(global::System.Func<T1,T2,T3,T4,T5,T6,T7,global::System.Threading.CancellationToken,global::System.Threading.Tasks.Task<TResult>> handler)
            {
                return async args =>
                {
                    var result = await handler((T1)args[0]!,(T2)args[1]!,(T3)args[2]!,(T4)args[3]!,(T5)args[4]!,(T6)args[5]!,(T7)args[6]!,default).ConfigureAwait(false);
                    return result;
                };
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task<TResult>> Convert<T1,T2,T3,T4,T5,T6,T7,T8,TResult>(global::System.Func<T1,T2,T3,T4,T5,T6,T7,T8,global::System.Threading.CancellationToken,global::System.Threading.Tasks.Task<TResult>> handler)
            {
                return async args =>
                {
                    var result = await handler((T1)args[0]!,(T2)args[1]!,(T3)args[2]!,(T4)args[3]!,(T5)args[4]!,(T6)args[5]!,(T7)args[6]!,(T8)args[7]!,default).ConfigureAwait(false);
                    return result;
                };
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task<TResult>> Convert<T1,T2,T3,T4,T5,T6,T7,T8,T9,TResult>(global::System.Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,global::System.Threading.CancellationToken,global::System.Threading.Tasks.Task<TResult>> handler)
            {
                return async args =>
                {
                    var result = await handler((T1)args[0]!,(T2)args[1]!,(T3)args[2]!,(T4)args[3]!,(T5)args[4]!,(T6)args[5]!,(T7)args[6]!,(T8)args[7]!,(T9)args[8]!,default).ConfigureAwait(false);
                    return result;
                };
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task<TResult>> Convert<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,TResult>(global::System.Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,global::System.Threading.CancellationToken,global::System.Threading.Tasks.Task<TResult>> handler)
            {
                return async args =>
                {
                    var result = await handler((T1)args[0]!,(T2)args[1]!,(T3)args[2]!,(T4)args[3]!,(T5)args[4]!,(T6)args[5]!,(T7)args[6]!,(T8)args[7]!,(T9)args[8]!,(T10)args[9]!,default).ConfigureAwait(false);
                    return result;
                };
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task<TResult>> Convert<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,TResult>(global::System.Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,global::System.Threading.CancellationToken,global::System.Threading.Tasks.Task<TResult>> handler)
            {
                return async args =>
                {
                    var result = await handler((T1)args[0]!,(T2)args[1]!,(T3)args[2]!,(T4)args[3]!,(T5)args[4]!,(T6)args[5]!,(T7)args[6]!,(T8)args[7]!,(T9)args[8]!,(T10)args[9]!,(T11)args[10]!,default).ConfigureAwait(false);
                    return result;
                };
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task<TResult>> Convert<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,TResult>(global::System.Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,global::System.Threading.CancellationToken,global::System.Threading.Tasks.Task<TResult>> handler)
            {
                return async args =>
                {
                    var result = await handler((T1)args[0]!,(T2)args[1]!,(T3)args[2]!,(T4)args[3]!,(T5)args[4]!,(T6)args[5]!,(T7)args[6]!,(T8)args[7]!,(T9)args[8]!,(T10)args[9]!,(T11)args[10]!,(T12)args[11]!,default).ConfigureAwait(false);
                    return result;
                };
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task<TResult>> Convert<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,TResult>(global::System.Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,global::System.Threading.CancellationToken,global::System.Threading.Tasks.Task<TResult>> handler)
            {
                return async args =>
                {
                    var result = await handler((T1)args[0]!,(T2)args[1]!,(T3)args[2]!,(T4)args[3]!,(T5)args[4]!,(T6)args[5]!,(T7)args[6]!,(T8)args[7]!,(T9)args[8]!,(T10)args[9]!,(T11)args[10]!,(T12)args[11]!,(T13)args[12]!,default).ConfigureAwait(false);
                    return result;
                };
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task<TResult>> Convert<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,TResult>(global::System.Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,global::System.Threading.CancellationToken,global::System.Threading.Tasks.Task<TResult>> handler)
            {
                return async args =>
                {
                    var result = await handler((T1)args[0]!,(T2)args[1]!,(T3)args[2]!,(T4)args[3]!,(T5)args[4]!,(T6)args[5]!,(T7)args[6]!,(T8)args[7]!,(T9)args[8]!,(T10)args[9]!,(T11)args[10]!,(T12)args[11]!,(T13)args[12]!,(T14)args[13]!,default).ConfigureAwait(false);
                    return result;
                };
            }

            public static global::System.Func<object?[],global::System.Threading.Tasks.Task<TResult>> Convert<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,TResult>(global::System.Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,global::System.Threading.CancellationToken,global::System.Threading.Tasks.Task<TResult>> handler)
            {
                return async args =>
                {
                    var result = await handler((T1)args[0]!,(T2)args[1]!,(T3)args[2]!,(T4)args[3]!,(T5)args[4]!,(T6)args[5]!,(T7)args[6]!,(T8)args[7]!,(T9)args[8]!,(T10)args[9]!,(T11)args[10]!,(T12)args[11]!,(T13)args[12]!,(T14)args[13]!,(T15)args[14]!,default).ConfigureAwait(false);
                    return result;
                };
            }
        }
    }
}
#pragma warning restore CS1591

// <auto-generated>
// THIS (.cs) FILE IS GENERATED BY TypedSignalR.Client
// </auto-generated>
#nullable enable
#pragma warning disable CS1591
#pragma warning disable CS8767
#pragma warning disable CS8613
namespace TypedSignalR.Client
{
    internal static partial class HubConnectionExtensions
    {
        private sealed class HubInvokerFor_global__TestSignalRCommon_IHubMessage : global::TestSignalRCommon.IHubMessage,IHubInvoker
        {
            private readonly global::Microsoft.AspNetCore.SignalR.Client.HubConnection _connection;
            private readonly global::System.Threading.CancellationToken _cancellationToken;

            public HubInvokerFor_global__TestSignalRCommon_IHubMessage(global::Microsoft.AspNetCore.SignalR.Client.HubConnection connection,global::System.Threading.CancellationToken cancellationToken)
            {
                _connection = connection;
                _cancellationToken = cancellationToken;
            }

            public global::System.Threading.Tasks.Task SendMessage(string user,string message)
            {
                return global::Microsoft.AspNetCore.SignalR.Client.HubConnectionExtensions.InvokeCoreAsync(_connection,nameof(SendMessage),new object?[] { user,message },_cancellationToken);
            }
        }

        private sealed class HubInvokerFactoryFor_global__TestSignalRCommon_IHubMessage : IHubInvokerFactory<global::TestSignalRCommon.IHubMessage>
        {
            public global::TestSignalRCommon.IHubMessage CreateHubInvoker(global::Microsoft.AspNetCore.SignalR.Client.HubConnection connection,global::System.Threading.CancellationToken cancellationToken)
            {
                return new HubInvokerFor_global__TestSignalRCommon_IHubMessage(connection,cancellationToken);
            }
        }

        private static partial global::System.Collections.Generic.Dictionary<global::System.Type,IHubInvokerFactory> CreateFactories()
        {
            var factories = new global::System.Collections.Generic.Dictionary<global::System.Type,IHubInvokerFactory>();

            factories.Add(typeof(global::TestSignalRCommon.IHubMessage),new HubInvokerFactoryFor_global__TestSignalRCommon_IHubMessage());

            return factories;
        }
    }
}
#pragma warning restore CS8613
#pragma warning restore CS8767
#pragma warning restore CS1591

Code and pdf at

https://ignatandrei.github.io/RSCG_Examples/v2/docs/TypedSignalR.Client


Posted

in

, ,

by

Tags:

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *