Null或泛型作为参数方法

本文关键字:参数 方法 泛型 Null | 更新日期: 2023-09-27 17:49:21

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

** EDIT 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())
            )
        );

Null或泛型作为参数方法

如果您可以稍微更改API,那么解决这个问题的一个简单方法是添加一个省略第二个参数的重载。在不发送任何数据的情况下,这对调用方也更容易。

:

protected void makeRequest<T>(Response<T> response, string url) where T : JsonObjectBase 
{ 
    makeRequest (response, default(JsonObjectBase), url); 
}

因为你很可能只需要访问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);

这是因为null的值没有告诉编译器该形参的类型。毕竟,makeRequest的实现可以检查T2的类型,并根据它看到的内容执行完全不同的操作。例如,如果您传递了一个类型为List<int>的变量,那么它将知道T2List<int>,但null可以是任何引用类型的值。如果编译器不能找出类型(或者如果它决定了错误的类型),您需要告诉它:

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

我刚刚指定了用于调用泛型方法的类型。在此例中,null参数的类型为object