8
votes

Comment puis-je obtenir des génériques pour travailler avec des valeurs de retour qui nécessitent un casting minutieux?

J'ai un code de couche d'accès aux données appelle une procédure stockée et renvoie des valeurs scalaires de divers types de données. La syntaxe est exécutée, exécuté, exécutant, etc. Je veux que ce soit exécuteur ou exécuteur

J'essaie cette implémentation et je ne peux pas compiler , sauf si je fais de la moulage en utilisant "(t) valeur", si j'essaie de vérifier le type et d'appeler une méthode pour faire la coulée, pas de chance de ce type.

Question mise à jour Pourquoi dois-je convertir en objet avant de convertir en t?

Code mis à jour xxx


2 commentaires

Hey je suis vraiment inquiet. Les trois premières réponses (avec les votes les plus élevés) sont soit avec des erreurs ou gonflées avec un code inutile.


@Andrey, bienvenue à = (je suis juste déçu de ne pas apprendre à apprendre de "casting soigné". J'étais tellement excité quand j'ai lu le titre. =)


4 Réponses :


1
votes
internal T Execute<T>(string storedProcName, Hashtable parameters)
{
      object res = ExecuteScalar(storedProcName, parameters);
      if (Convert.IsDBNull(res))
         return default(T); //or handle somehow
      return (T)Convert.ChangeType(res, typeof(T));
}

5 commentaires

@Andrey - qui ne compilera pas.


Vous n'avez pas vérifié ça! Mais merci de toute façon, ça m'a placé dans la bonne route et je pense que je l'ai eu. J'ai mis à jour ma question avec le nouveau code.


En fait, j'ai vérifié votre code dans le compilateur pour voir si votre chemin fonctionnerait, car il était définitivement plus propre que de faire de type de typeof (t). Mais malheureusement, c'est nécessaire. Downvote supprimé :).


@DCP je confond toujours ces types de comparaisons sans IDE


@Matthewmartin Vérifiez la modification. Je n'ai pas d'IDE à la main pour vérifier que cela fonctionne mais je pense que cela devrait :)



14
votes

Essayez ceci: xxx

mis à jour : Manipulation DBNull fixe


3 commentaires

Intéressant, il semble que Changetype ne supporte que des choses qui supportent l'iconvertable. Je n'avais jamais vu cette technique auparavant. Merci!


@Matthewmartin Tous les types primitifs le soutiennent. Mais cette méthode n'est pas bonne car Max n'a pas vérifié pour Dbnull


C'est mieux maintenant! non descendant



1
votes

Essayez le mot-clé "comme" xxx


2 commentaires

Convertir.Changetype fait tout ce qui vous convient. et vous ne vérifiez pas dbnull


Non. Le mot clé 'comme' n'est pas valide pour les types de valeur.



0
votes

Peut-être que votre fonction pourrait plutôt être modifiée pour permettre la fonction de conversion d'objet à transmettre: xxx pré>

puis vous pouvez créer des surcharges pour celles que vous connaissez: p>

internal string ExecuteForString(string storedProcName, Hashtable parameters)
{
    return Execute(storedProcName, parameters, (o) => o.ToString());
}

internal int ExecuteForInt(string storedProcName, Hashtable parameters)
{
     return Execute(storedProcName, parameters, Convert.ToInt32);
}


3 commentaires

Malheureusement, vous ne pouvez pas surcharger sur des types de retour, les types d'arguments doivent différer du type et / ou du nombre.


Intéressant, je n'ai jamais vu par défaut (t) de t avant je pense que je vais l'utiliser. Supprimez cette partie qui ne compilera pas pour pouvoir uppouver votre réponse.


Avoir des fonctions renommées pour éviter les problèmes de compilation, car je pense que c'est préféré plutôt que de finir avec un cas de type que vous ne pouvez pas résoudre pour l'appelant ...