RPC 的 C# 动态签名
C# Dynamic Signature for RPC
简而言之,我想为 Unity3d (mono) 实现一个 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# 不允许动态签名,因此我必须为每种可能的类型定义一个签名,例如
请求调用(string method, int a, int b)
请求调用(string method, string a, int b)
...
所以今天我想到了这个想法,它可以让事情更容易编写并且非常接近我想要的,而不是传递参数,我将传递一个构建参数的回调方法。然后结果将被序列化。
rpc.call("add", () => [1, 2])
但我想这并没有太大帮助,因为代表仍然必须有一个特定的 return 类型,这让我无处可去。
我该怎么做?
参数关键字
听起来您正在寻找的是 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");
简而言之,我想为 Unity3d (mono) 实现一个 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# 不允许动态签名,因此我必须为每种可能的类型定义一个签名,例如
请求调用(string method, int a, int b) 请求调用(string method, string a, int b) ...
所以今天我想到了这个想法,它可以让事情更容易编写并且非常接近我想要的,而不是传递参数,我将传递一个构建参数的回调方法。然后结果将被序列化。
rpc.call("add", () => [1, 2])
但我想这并没有太大帮助,因为代表仍然必须有一个特定的 return 类型,这让我无处可去。
我该怎么做?
参数关键字
听起来您正在寻找的是 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");