Y a-t-il un meilleur moyen d'écrire ce code ..
MyObject pymt = new MyObject(); pymt.xcol1id= Convert.IsDBNull(row["col1id"]) ? 0 : (int)row["col1id"]; pymt.xcold2id= Convert.IsDBNull(row["col2id"]) ? String.Empty : (string)row["col2id"]; pymt.xcold3id = Convert.IsDBNull(row["CustNum"]) ? 0 : (decimal)row["xcold3id"];
7 Réponses :
static ToType GenericConvert<ToType>(object value)
{
ToType convValue = default(ToType);
if (!Convert.IsDBNull(value))
convValue = (ToType)value;
return convValue;
}
MyObject pymt = new MyObject();
pymt.xcol1id= GenericConvert<int>(row["col1id"]);
pymt.xcold2id= GenericConvert<string>(row["col2id"]) ?? String.Empty;
pymt.xcold3id = GenericConvert<decimal>(row["CustNum"]);
J'aimerais vraiment ça. Notre équipe utilisait des déclarations si / sinon plus difficiles à lire à mon avis.
if (row["col1id"] == dbnull.value) pymt.xcol1id = 0; else pymt.xcol1id = (int)row["col1id"];
Vous pouvez faire des méthodes d'extension génériques telles que ceci: utilisation: p>
+1 Votre implémentation est meilleure que la mienne, je m'adresse à la mine pour corriger ce que vous avez mentionné. Mais maintenant ça a l'air sale :(
J'ai décidé d'utiliser cette approche car j'utilise VS2005, version 2.0. Merci à tous pour votre contribution, j'apprécie beaucoup ...
J'ai tendance à utiliser l'opérateur de coalescence nul dans des situations comme celles-ci. En outre, dbnull.tostring renvoie String.empty, de sorte que vous n'ayez pas à faire quelque chose d'envie là-bas.
MyObject pymt = new MyObject(); pymt.xcol1id= row["col1id"] as int? ?? 0; pymt.xcold2id= row["col2id"].ToString(); pymt.xcold3id = row["CustNum"] as decimal? ?? 0;
+1 J'allais écrire ceci initialement, mais j'ai décidé d'écrire un convertisseur générique.
Cela ne fonctionnera pas si la propriété que vous définissez est un int et non un int? est-ce que cela va?
Ce sera, parce que le compilateur se rend compte qu'il n'ya aucun moyen qu'un null soit défini.
Bien que cela fonctionne, je soupçonne que les méthodes fournies dans System.Data.DataSetExtensions.dll sont plus efficaces, car le réflecteur me montre un peu de code visant efficacement les types de valeur de boxe efficaces dans cet ensemble. Pour être juste, je n'ai géré aucun point de repère pour comparer les deux approches.
Certaines alternatives que je peux ressembler rapidement à: p>
Mieux encore, ajoutez-le comme une méthode d'extension au Vous pouvez l'utiliser comme: p> datarow code>:
Bon point. Votre réponse est plus complète, meilleure pour vérifier votre réponse que pour ajouter davantage au bruit.
Absolument, il existe un moyen plus propre d'écrire ce code si vous utilisez .NET 3.5 et sans réinventer des méthodes d'extension que Microsoft vous a déjà écrit. Ajoutez simplement une référence à System.Data.DaTasetexsions.dll a >, et vous pourrez faire ceci: MyObject pymt = new MyObject
{
xcol1id = row.Field<int?>("col1id") ?? 0,
xcol2id = row.Field<string>("col2id") ?? String.Empty,
xcol3id = row.Field<decimal?>("col3id") ?? 0M
};
Dupliqué possible de moyen le plus efficace Pour vérifier le dbnull, puis assigner à une variable?