我們從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");
這仍然繁瑣,而且所有類型的基元都需要擴展方法。它也混淆了代碼。我在object
上創建了一個通用擴展方法,名爲As<T>
。用法是這樣的:
string username = dr["Username"].As<string> ("Anonymous");
這種相對簡單的變化已經達到泰然自若地與其他開發者,並在地方有很多的習慣。我不滿意的部分是潛在的性能影響。 現在,我知道沒有過早優化。我絕對編寫了代碼,沒有任何過早的優化,並且它的封裝足夠,以後優化它不應該是一個大問題。我已經對該方法進行了基準測試,以在相對適中的2GHz工作站上每秒執行大約250萬次轉換,而且我必須承認,與節省其他開發人員和提高可讀性的時間相比,這是驚人的性能。但是,考慮到下面的代碼示例,我覺得我濫用語言功能,並且可以做得更好。該方法與「HERE BE DRAGONS」xmldoc'ed大聲哭泣!我正在尋找更好的方法來避免雙重拳擊。爲簡潔起見,我省略的實際版本在許多情況下實際使用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...
}
你的'As'代碼示例不能編譯。 –
phoog