J'essaye de créer une fonction générique pour analyser mon résultat json avec Newtonsoft:

private T ParseResult<T>(string queryResult)
{
    Result res = JsonConvert.DeserializeObject<Result>(queryResult);

    if (res.Success == 1)
    {
        try
        {
            return JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(res.data));
        }
        catch (Exception)
        {
            return default(T);
        }
    }
    return default(T);
}

S'il y a un problème avec Success ou l'analyse, je veux retourner un objet vide de tout ce que T est (actuellement des listes ou juste des objets personnalisés).

Mon problème est que la solution actuelle renvoie null au lieu d'un objet vide. Comment puis-je faire en sorte que la valeur de retour ne soit jamais nulle.

1
fsulser 20 mars 2019 à 11:53

3 réponses

Meilleure réponse

Indépendamment de savoir si c'est la bonne ou la mauvaise approche. Le problème est que default(T) retournera la valeur par défaut pour le type , pour les types de référence c'est-à-dire null. Si vous voulez un "objet vide" (nouvel objet), vous devrez utiliser le new constraint et new it up (instancier)

Exemple

private T ParseResult<T>(string queryResult) where T : new()
{

    ...

    return new T();

}

Remarque : il y a cependant des mises en garde

nouvelle contrainte (référence C #)

La nouvelle contrainte spécifie que tout argument de type dans une classe générique La déclaration doit avoir un constructeur public sans paramètre . Pour utiliser le nouvelle contrainte, le type ne peut pas être abstrait.


Ressources supplémentaires

expressions de valeur par défaut (guide de programmation C #)

Une expression de valeur par défaut default(T) produit la valeur default d'un tapez T. Le tableau suivant montre les valeurs produites pour divers types:

  • Tout type de référence: null
  • Type de valeur numérique: 0
  • bool: false
  • char: \0
  • enum: valeur produite par l ' expression (E)0, où E est l'identifiant enum.
  • struct: valeur produite en définissant tous les champs de type valeur sur leur valeur par défaut et tous les champs type de référence sur null.
  • Type Nullable: une instance pour laquelle la propriété HasValue est false et la propriété Value n'est pas définie.
5
Michael Randall 20 mars 2019 à 09:25

T pourrait être une classe qui n'a pas de constructeur par défaut: dans ce cas, new T() serait une instruction invalide.

Si vous souhaitez revenir avec l'objet par défaut, vous pouvez utiliser Activator.CreateInstance au lieu de renvoyer default(T) comme ci-dessous:

return Activator.CreateInstance(typeof(T));

Si vous souhaitez y passer des paramètres, utilisez comme ci-dessous:

return (T)Activator.CreateInstance(typeof(T), args);
0
Bhavik Patel 20 mars 2019 à 09:15

Merci pour les réponses. J'ai fini par créer cette fonction qui semble fonctionner et je pense que c'est une meilleure approche:

    private static T ParseResult<T>(string queryResult) where T : new()
    {
        try
        {
            Result<T> res = JsonConvert.DeserializeObject<Result<T>>(queryResult);

            if (res.Success == 1)
            {
                return res.Data;
            }
            return new T();
        }
        catch (Exception) {
            return new T();
        }
    }

Et

internal class Result<T>
{
    [JsonProperty("success")]
    public int Success { get; set; }
    [JsonProperty("data")]
    public T Data { get; set; }
}
0
fsulser 20 mars 2019 à 09:39