首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更快的Convert.ChangeType版本

更快的Convert.ChangeType版本
EN

Stack Overflow用户
提问于 2009-10-07 15:01:46
回答 5查看 15.7K关注 0票数 11

在我拥有的一个应用程序中,为了将值转换为动态加载的类型,我经常调用Convert.ChangeType

然而,在分析了ANTS之后,我发现这个Convert.ChangeType似乎占用了很大一部分时间(因为经常被调用)。有没有人有更快的替代方法?

此时,我有一个包含目标的类型对象和一个包含值的string

下面是有问题的代码。我正在考虑在type上执行switch语句(因为它是一个有限的类型集合)并调用解析方法,尽管我不确定这样做是否会更快。

代码语言:javascript
复制
if(attributeRow["Value"]!=DBNull.Value)
    sample[attr] = attr.AttributeType == typeof(Guid)
                 ? new Guid(attributeRow["Value"].ToString())
                 : (IComparable)Convert.ChangeType(attributeRow["Value"],attr.AttributeType);
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-10-07 15:29:26

除了Convert.ChangeType函数(很明显,还有显式类型转换)之外,我不知道框架本身中还有其他用于更改类型的功能。

为此,我认为改善这一点的唯一另一种方法是推出您自己的ChangeType函数,该函数专门针对您的特定情况进行优化(如果可能)。

您提到您正在处理的类型数量有限,也许您正在处理的类型比其他类型多?如果是这样的话,您的ChangeType函数可以被优化为首先尝试这个特定的转换,只有在失败时才尝试其他转换。您提到尝试切换样式的代码块,同样的方法(首先尝试最常用的Type )也可以应用于此。至于它是否会更快,这取决于您正在处理的数据(以及您要转换/转换的类型的频率/可变性),衡量这一点的唯一真正的方法是尝试它,并与Convert.ChangeType方法进行比较。

如果你想实现自己的功能,可以在Peter Johnson的博客上找到一个有趣的链接:

Convert.ChangeType doesn't handle nullables

一定要阅读所有对这篇文章的评论。

票数 9
EN

Stack Overflow用户

发布于 2011-05-24 18:25:41

这是我的一个更快的ChangeType版本。我猜这个原理和@CraigTP的建议是一样的,但是,它只适用于可以为空的值类型。

我把我的转换方法建立在这样一个事实上,即值的类型在某种程度上更有可能与目标类型兼容。但是这种方法并不是为性能而设计的,它的设计目的是为了方便。这不是我想在紧凑的循环中调用的东西。

我仍然在使用ChangeType,但我会尽可能早地选择退出。

代码语言:javascript
复制
public static T? ToOrDefault<T>(object value)
    where T : struct, IConvertible
{
    var x = value as T?;
    if (x.HasValue)
    {
        return x;
    }
    if (value == null || Convert.IsDBNull(value))
    {
        return null;
    }
    try
    {
        return (T)Convert.ChangeType(value, typeof(T), CultureInfo.InvariantCulture);
    }
    catch (InvalidCastException)
    {
    }
    catch (FormatException)
    {
    }
    catch (OverflowException)
    {
    }
    catch (ArgumentException)
    {
    }
    return default(T?);
}
票数 3
EN

Stack Overflow用户

发布于 2013-02-20 06:25:19

我还没有测试是否更快,但这是动态类型转换的另一种方法。这是alsp更通用的,因为Convert.ChangeType()有一些限制,如您所见(Guids,可空类型)

代码语言:javascript
复制
value = (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFromInvariantString(str);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1532197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档