2017-01-12 17 views
1

簡而言之,我想爲Unity3d(單聲道)實現一個JSONRPC2 api到NodeJS服務器。RPC的C#動態簽名

我是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 b) 請求調用(字符串的方法,字符串,INT b) ...

所以今天我來到這個想法這將使事情變得更簡單編寫和非常接近我想要什麼,而不是pa選擇參數,我會傳遞一個構建參數的回調方法。然後結果會被序列化。

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實現。 –