9
votes

Méthode d'extension retour à l'aide de génériques

est-il possible de renvoyer un générique A> Type utilisant Méthodes d'extension ?

Par exemple, j'ai la méthode suivante: p>

double value = row.Get<double>("tangible-equity");


1 commentaires

BTW, tout comme vous le savez, vous pouvez simplement écrire "double valeur = rangée.get (" tangible-équité ");" et sautez le "" parce que le compilateur va le comprendre


3 Réponses :


3
votes

C'est possible. Cela pourrait être quelque chose comme ce qui suit: xxx


4 commentaires

System.InvalidcastException: La distribution spécifiée n'est pas valide.


Cela se produira si votre colonne de base de données n'a pas du même type que la réponse de T. @ Brokenglass doit convertir correctement des objets de différents types.


Cela arrivera souvent assez de types de données de traitement de la DB


D'accord. Mieux utiliser Convert.Changetype ()



1
votes

Le datarow a une méthode d'extension appelée champ qui fera beaucoup ce que vous essayez de faire. Je ne sais pas exactement comment cela se comportera avec une valeur nulle sur un double (je sais que cela gérera des types nullables). Cela peut ne pas être exactement ce que vous recherchez, mais vaut la peine de regarder. XXX


2 commentaires

Ce n'est pas linq. C'est juste une méthode d'extension sur datarow. C'est presque exactement ce que vous essayez de construire.


Je pense que vous devez ajouter ref à system.data.datasetextensions.dll



16
votes

Que diriez-vous de celui-ci:

    public static T Get<T>(this DataRow row, string field) where T: IConvertible 
    {
        if (row != null && row.Table.Columns.Contains(field))
        {
            object value = row[field];
            if (value != null && value != DBNull.Value)
                return (T)Convert.ChangeType(value, typeof(T));
        }
        return default(T);
    }


1 commentaires

devrait prendre en charge tous les types qui implémentent iconvertibles