DataRow
から梱包して開梱します。はい、私たちはORMを使うべきですが、それまではこれが私たちのものです。この種の動作を行うためのより汎用的な方法はありますか?
string username;
var temp = dr["Username"];
if (DbNull.Equals (temp))
{
username = "Anonymous";
} else {
username = dr["Username"].ToString();
}
これはパターンとなり、ヘルパーメソッドに翻訳され、最終的に:
string username = StringExtensions.SafeParse (dr["Username"], "Anonymous");
これはまだ面倒であり、その結果、このようなコードがたくさんありますすべての種類のプリミティブに必要な拡張メソッド。また、コードを混乱させる。 As<T>
と呼ばれるobject
に汎用拡張メソッドを作成しました。使い方は以下のようになります。
string username = dr["Username"].As<string> ("Anonymous");
この比較的単純な変更は、他の開発者と偉大な冷静で満たされている、と多くの場所に慣れています。私が不満を感じているのは、潜在的なパフォーマンスの影響です。 今、私は早めの最適化がないことを知っています。早すぎる最適化を行わずにコードを書いたことは間違いありません。後でそれを最適化することは大したことではありません。私は比較的控えめな2GHzワークステーションで毎秒250万回のコンバージョンを行う方法をベンチマークしました。これは他の開発者を保存する時間と読みやすさの向上に比べて驚異的なパフォーマンスです。しかし、以下のコードのサンプルを見ると、私は言語の機能を誤っているように感じ、もっとうまくいくかもしれません。このメソッドはxmldocされています。 "大声で叫ぶ"と大声で叫びます!私はダブルボクシングを避けるためのより良い方法を探しています。私が簡潔にするために省略した実際のバージョンは、多くの場合、実際にはTryParse
を使用しています。
public static TDestination As<TDestination> (this object source, TDestination defaultValue = default(TDestination))
{
if (source is TDestination)
return (TDestination) source;
if (source == null || DbNull.Equals(source))
return defaultValue;
if (TDestination is int)
return (TDestination) (object) Convert.ToInt32 (source.ToString());
if (TDestination is long)
return (TDestination) (object) Convert.ToInt64 (source.ToString());
if (TDestination is short)
return (TDestination) (object) Convert.ToInt16 (source.ToString());
// and so on...
}
あなたの ''コードサンプルはコンパイルされません。 –
phoog