2017-01-12 8 views
1

Короче говоря, я хочу реализовать JSONRPC2 api для Unity3d (mono) на сервере NodeJS.C# Динамическая подпись для RPC

Я довольно новичок в C#, и я чувствую, что то, что я ищу, вряд ли возможно.

В настоящее время я могу сделать что-то вроде этого:

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

Как вы можете видеть, что делает вызов к RPC является довольно громоздким, печатая все это занимает некоторое время.

То, что я хотел бы иметь что-то вроде этого:

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

Поскольку C# не допускает динамическую подпись, я должен был бы задать подпись для каждого возможного типа как

запрос вызов (строковый метод, Int а, внутр б) Запрос вызова (метод строка, строка а, ИНТ б) ...

Итак, сегодня я пришел с этой идеей, которая бы сделать вещи проще писать и довольно близко к что бы я хотел, вместо па ssing, я бы передал метод обратного вызова, который строит параметры. Затем результат будет сериализован.

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

Но я предполагаю, что это не помогает, потому что делегат все еще должен иметь определенный тип возврата, который не приносит мне нигде.

Как я могу это сделать?

ответ

1

Params ключевое слово

Это похоже на то, что вы ищете является C# params keyword, что позволяет иметь любое количество параметров для функции. Поскольку тип ваших параметров также различается, он также может использовать только object как уловку. Так, например:

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; 

} 

Предоставление Вам первоначального предполагаемого использования:

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

Это звучит так же, как то, что я искал. Правильно ли я считаю, что это похоже на многоточие в C/C++? –

+0

@ LoïcFaure-Lacroix Да, это очень похоже, только с расширением возможности указать ограничение типа (и это обычный массив C#, а не необходимость какой-либо специальной обработки). –

+0

Отлично работает. Я могу закончить свою первую реализацию jsonrpc2. –