用于RPC的C#动态签名

时间:2017-01-12 13:33:04

标签: c# unity3d mono rpc

简而言之,我想将Unity3d(单声道)的JSONRPC2 api实现到NodeJS服务器。

我对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 a,int b)    请求调用(字符串方法,字符串a,int b)    ...

所以今天我提出了这个想法,它会使写入更简单,非常接近我想要的,而不是传递参数,我传递一个构建参数的回调方法。然后结果将被序列化。

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

但是我觉得它没有多大帮助,因为代表仍然必须有一个特定的返回类型,这让我无处可去。

我该怎么做?

1 个答案:

答案 0 :(得分:1)

Params关键字

听起来你正在寻找的是C# params keyword,它可以为你提供任意数量的函数参数。由于参数的类型也各不相同,因此也可以使用private void btnAdd_Click(object sender, EventArgs e) { OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter = "Name list|*.txt"; try { if (ofd.ShowDialog() == DialogResult.OK) { string[] nameList = File.ReadAllLines(ofd.FileName); foreach (string line in nameList) { ListViewItem lvi = new ListViewItem(); string lastName = line.Split(':')[1]; //This is what I dont understand lvi.SubItems.Add(lastName); lvNames.Items.Add(lvi); string firstname = ""; IP = line.Replace(lastName, "").Replace(":", ""); lvi.Text = firstname; } } } catch (Exception ex) { } } 作为全部捕获。所以,像这样:

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;

}