我们从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 万次转换的方法进行了基准测试,我必须承认,与它为其他开发人员节省的时间和我们获得的可读性提升相比,这是惊人的性能。但是,鉴于下面的代码示例,我觉得我在滥用语言功能并且可以做得更好。该方法在 xmldoc 中用“HERE BE DRAGONS”大声呼喊!我正在寻找一种更好的方法来避免双重拳击。为简洁起见我省略的实际版本实际上使用 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...
}
最佳答案
为什么不检查您的对象是否为 IConvertible,如果是,则使用 ToType:
var convertible = source as IConvertible;
if (convertible != null)
return (TDestination)convertible.ToType(typeof(TDestination), Thread.CurrentThread.CurrentUICulture);
关于c# - 是否有更通用的方法来执行此类行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7922964/