【问题标题】:Conditional type argument in C#C# 中的条件类型参数
【发布时间】:2018-11-15 13:09:11
【问题描述】:

我想将对象反序列化为给定的类类型,具体取决于 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) 标记为“不需要”?还是我应该选择不同的方法?

【问题讨论】:

  • 传递一个null 值怎么样?
  • 2 个函数在这里似乎是合适的方法。
  • 如果我在你的鞋子里,我创建一个带有状态字段的超类并将孔对象包装到一个类中
  • @MahdiFarhani 我认为这不会改变任何事情,我也不能在那里使用“条件”类型参数。
  • @LoztInSpace 是的,我只是想知道,因为我想跳过代码可重复性。如果没有任何帮助,我会尝试您的解决方案。

标签: c# generics generic-type-argument


【解决方案1】:

您的代码没有意义。 responseJson 对象不能同时是 Dictionary&lt;string, string&gt;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);
}

这只是避免了代码重复。

【讨论】:

  • 按照 cmets 的建议,这是我采用的解决方案。 +1。由于缺乏关于 C# 的知识(仍在学习),我发布了这个问题。我认为有一些魔术可以提供帮助(C# 有很多;))。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-18
  • 2023-01-17
  • 2020-10-27
  • 2021-08-04
  • 2020-11-10
  • 2019-02-18
相关资源
最近更新 更多