c# - 是否有更通用的方法来执行此类行为?

标签 c# generics

我们从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/

相关文章:

c# - 货币格式: Remove insignificant Zeros

c# - 如何验证我从 Web API 中的 WPF 客户端收到的访问 token ?

java - 具有相同的删除功能,但两者都不会覆盖仅在一种情况下出现的其他警告

c++ - 为泛型类传递比较函数

java - 如何扩展抽象泛型抽象接口(interface)?

c# - 在 C#/.NET 中将参数标记为 NOT nullable?

c# - Linq to SQL 在访问属性之前检查对象上的空值

c# - 使用来自另一个程序集的 WPF 样式

c# - 返回简单类型的通用方法

Java:如果抽象类Foo返回Object,具体类Bar可以返回String或Integer吗?