在Java中,你可以这样做:
protected void makeRequest<T extends BaseJsonClass, T2 extends BaseJsonClass> (Response<T> response, T2 dataToSend, String url) {}
有些请求:
makeRequest(response, null, serverUrl);
makeRequest(response, jsonData, serverUrl);
在C#中怎么做?
我编写的方法应该能够接受数据为null或特定类型的对象。
/**
* Make a request to the server.
* dataToSend can be null.
* */
protected void makeRequest<T, T2>(Response<T> response, T2 dataToSend, string url) where T : JsonObjectBase where T2 : JsonObjectBase
{ }
目前我遇到了问题:
The type arguments for method `BaseModelController.makeRequest<T,T2>(Response<T>, T2, string)'
cannot be inferred from the usage. Try specifying the type arguments explicitly
我如何允许也可能为null的泛型?
**编辑1 **
我这样调用这个方法:
makeRequest(response, null, serverUrl);
或
makeRequest(response, someJsonData, serverUrl);
**编辑2 **
JsonObjectBase
只是一个由其他Json类扩展的对象,所以我可以自动地解析/序列化它们,因为它知道它永远是一个Json对象。我用它来进行类型检查,这样其他程序员就不会犯错误输入未知物体
传递null实际上比定义相同的值要好得多,这个值是“假设”。不做任何事;因为那很快就会变得混乱。
力量的例子
ModelControllerAccount.getInstance().createUser(
username.text, password.text, // Params
new Response<JsonUserAccountFeedback>(
success: (jsonObjectStandardResponse) => Debug.Log("Success when creating account. Data: " + jsonObjectStandardResponse.getAccessToken()),
failed: (failedReason) => Debug.Log("Failed to make request. Reason: " + failedReason.getReasonDescription())
)
);
答案 0 :(得分:3)
如果您可以稍微更改API,一种简单的解决方法是添加省略第二个参数的重载。在您不发送任何数据的情况下,调用者也会更容易。
像这样:
protected void makeRequest<T>(Response<T> response, string url) where T : JsonObjectBase
{
makeRequest (response, default(JsonObjectBase), url);
}
答案 1 :(得分:1)
由于你很可能只需要访问JsonObjectBase的方法,你可以这样做:
protected void MakeRequest<T>(Response<T> response, JsonObjectBase dataToSend, string url) where T : JsonObjectBase
{
}
并调用如下方法:MakeRequest(response, null, serverUrl);
或者您甚至可以利用可选参数:
protected void MakeRequest<T>(Response<T> response, string url, JsonObjectBase dataToSend = null) where T : JsonObjectBase
{
}
并调用如下方法:MakeRequest(response, serverUrl);
答案 2 :(得分:0)
这是因为null
的值不告诉编译器该参数的类型。毕竟,makeRequest
的实施可以检查T2
的类型,并根据它看到的内容做很多不同的事情。如果您已经通过了类型为List<int>
的变量,则会知道T2
为List<int>
,但null
可能是任何引用类型的值。如果编译器无法弄清楚类型(或者它是否决定了错误的类型),你需要告诉它:
Response<string> myResponse;
makeRequest<Response<string>, object>(myResponse, null, "http://example.com");
我刚刚指定了用于调用泛型方法的类型。在这种情况下,null
参数的类型为object
。