SignalR Client with Multiple Parameters

I’m new to stackoverflow and has been a lurker for many years and has been a great help for me as a developer. Many thanks.

Ending my introduction with this very first post and question:

The Scenario:

I’m working with SignalR.

I have a SignalR server that broadcast a message to all the clients with 6 parameters.

When I implement it in a Web Client (MVC) it works fine and I can get all those 6 parameters.

I tried implementing it in Xamarin.

Here is the sample proxy snippet:

proxy.On<string, string, string , string, string, string>("test", (test1, test2, test3, test4, test5, test6) =>
            {
                MyActivity.RunOnUiThread(() =>
                {
                    //my method here
                });
            });

When I have 6 parameters I’ll get this error:

‘IHubProxy’ does not contain a definition for ‘On’ and no extension method ‘On’ accepting a first argument of type ‘IHubProxy’ could be found (are you missing a using directive or an assembly reference?)

But when I changed my parameters to 4

proxy.On<string, string, string , string>("test", (test1, test2, test3, test4) =>
        {
            MyActivity.RunOnUiThread(() =>
            {
                //my method here
            });
        });

I would not get an error and I will be able to get those 4 params. But In my application I need to get all those 6 params.

Why is it that whenever I have more than 4 params I get this error?

Am I missing something?

Thanks!

Answer

That’s just a limitation on the SignalR .NET client proxy. It seems that the devs were a bit lazy about overriding the On method to support more Type parameters or maybe they just considered that if you’ve got more params you should group them in a class.

The solution is really simple. Create a class including as many properties as you need instead of using parameters. Something like:

public class AllParams
{
    public string Prop1 { get; set; }
    public string Prop2 { get; set; }
    public string Prop3 { get; set; }
    public string Prop4 { get; set; }
    public string Prop5 { get; set; }
    public string PropN { get; set; }
}

proxy.On<AllParams>("test", all =>
{
    MyActivity.RunOnUiThread(() =>
    {
        // all.Prop1, all.Prop2, etc...
    });
});

This can even improve your code readability.