C#中的条件类型参数

时间:2018-06-05 23:41:56

标签: c# generics generic-type-argument

我想将对象反序列化为给定的类类型,具体取决于ajax响应是否成功。

所以我写了以下方法:

public IAjaxResponse GetResponse<TOk, TFail>()
{
    var responseJson = this.response as Dictionary<string, object>;

    object obj = null;

    if ((string)responseJson["status"] == "ok")
        obj = JsonConvert.DeserializeObject<TOk>(responseJson);
    else
        obj = JsonConvert.DeserializeObject<TFail>(responseJson);

    return (IAjaxResponse)obj;
}

现在使用非常简单:

var response = GetResponse<ClassWhenOk, ClassWhenFail>();
if (response is ClassWhenFail responseFail) {
    Error.Show(responseFail.message);
    return;
}
[..]

现在我的问题是:有时候,会有一般性的回复发生,总是“好”。状态所以我不想将第二种类型的参数用于失败状态。

所以我想要使用类似的东西:

               \/ notice one type argument
GetResponse<ClassWhenOk>();

这是不允许的,因为使用这种通用方法需要2个类型参数。

所以这是我的问题

我能以某种方式将第二种类型的参数(TFail)标记为“不是必需的”&#39 ;?或者我应该采取不同的方法?

1 个答案:

答案 0 :(得分:2)

你的代码没有意义。 responseJson对象不能同时为Dictionary<string, string>string。能够发布实际代码供我们工作将是一件好事。

这是一个重构的示例,它可以进行编译,但需要一些工作才能在运行时正常运行。尽管如此,你所需要的只是一种替代的超载来使这项工作。

public IAjaxResponse GetResponse<TOk, TFail>(string response)
{
    var responseJson = new Dictionary<string, object>();

    object obj = null;

    if ((string)responseJson["status"] == "ok")
        obj = Newtonsoft.Json.JsonConvert.DeserializeObject<TOk>(response);
    else
        obj = Newtonsoft.Json.JsonConvert.DeserializeObject<TFail>(response);

    return (IAjaxResponse)obj;
}

public IAjaxResponse GetResponse<TOk>(string response)
{
    return (IAjaxResponse)Newtonsoft.Json.JsonConvert.DeserializeObject<TOk>(response);
}

第二种方法甚至可以是这样的:

public IAjaxResponse GetResponse<TOk>(string response)
{
    return GetResponse<TOk, FailDontCare>(response);
}

这只是避免了代码重复。