Условный аргумент типа в C # - PullRequest
0 голосов
/ 06 июня 2018

Я хотел бы десериализовать объект в данный тип класса, в зависимости от того, был ли успешным ответ 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) как «не требуется»?Или мне лучше пойти по другому пути?

1 Ответ

0 голосов
/ 06 июня 2018

Ваш код просто не имеет смысла.Объект 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);
}

, который просто избегает дублирования кода.

...