2017-01-12 3 views
1

Kurz gesagt, ich möchte eine JSONRPC2 API für Unity3d (Mono) auf einem NodeJS Server implementieren.C# Dynamische Signatur für RPC

Ich bin ziemlich neu in C# und ich fühle, dass das, was ich tun möchte, kaum möglich ist.

Derzeit kann ich so etwas tun:

JSONRequest request = new JSONRequest(); 
JSONNode jsonParams = new JSONNode(); 
.... 
request.params = jsonParams; 
socket.Send(request.toJSON()); 

Wie Sie sehen können, um einen Anruf zu einem RPC macht ziemlich ausführlich ist und all dies die Eingabe einige Zeit in Anspruch nimmt.

Was ich möchte, ist haben, so etwas wie dieses:

req = rpc.call('add', 1, 2); 
req.success += SuccessCallback 
req.error += ErrorCallback 

Da C# nicht dynamische Signatur erlaubt, würde ich eine Signatur für jede mögliche Art wie

Antrag definieren müssen call (String-Methode, int a, int b) anfordern Aufruf (String-Methode, string a, int b) ...

Also heute bin ich mit dieser Idee, die Dinge einfacher zu schreiben und ziemlich nah dran machen würde was ich möchte, anstatt pa Wenn ich Parameter verwende, würde ich eine Callback-Methode übergeben, die Parameter erzeugt. Dann würde das Ergebnis serialisiert werden.

rpc.call("add",() => [1, 2]) 

Aber ich denke, es hilft nicht viel, weil der Delegierte immer noch einen bestimmten Rückgabetyp haben muss, der mich nirgends bringt.

Wie kann ich das tun?

Antwort

1

Params Stichwort

Es klingt wie für das, was Sie suchen die C# params keyword ist, die Sie beliebig viele Parameter für eine Funktion haben können. Da auch die Art Ihrer Parameter variieren kann, kann sie auch einfach als Fang verwenden. So, wie folgt aus:

public void call (string method, params object[] args) { // Any number of any type 

    // Create the request: 
    JSONRequest request = new JSONRequest(); 
    JSONNode jsonParams = new JSONNode(); 

    // For each arg: 
    foreach (object argument in args) { 

     // (guessing JSONNode here - I don't know if it has 'Add') 
     jsonParams.Add(argument); 

    } 

    request.params = jsonParams; 

} 

Gibt Ihnen die ursprünglich beabsichtigte Nutzung:

rpc.call("hello", "first", 2, "third"); 
+0

Es klingt genau wie das, was ich suchte. Habe ich recht zu denken, dass es in C/C++ so ziemlich wie eine Ellipse ist? –

+0

@ LoïcFaure-Lacroix Ja, es ist sehr ähnlich, nur mit der Erweiterung in der Lage zu sein, eine Typeinschränkung zu spezifizieren (und es ist ein gewöhnliches C# -Array, anstatt eine spezielle Handhabung zu benötigen). –

+0

Funktioniert gut. Ich könnte meine erste Implementierung von jsonrpc2 beenden. –