Null OR generic作为参数方法

时间:2016-06-26 17:09:26

标签: c# generics

在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())
            )
        );

3 个答案:

答案 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>的变量,则会知道T2List<int>,但null可能是任何引用类型的值。如果编译器无法弄清楚类型(或者它是否决定了错误的类型),你需要告诉它:

Response<string> myResponse;
makeRequest<Response<string>, object>(myResponse, null, "http://example.com");

我刚刚指定了用于调用泛型方法的类型。在这种情况下,null参数的类型为object