繁体   English   中英

Convert.ChangeType的更快版本

[英]Faster version of Convert.ChangeType

在我的应用程序中,我经常调用Convert.ChangeType以将值转换为动态加载的类型。

然而,在使用ANTS进行分析之后,我发现这个Convert.ChangeType似乎占用了相当长的一部分时间(由于经常被调用)。 有没有人有更快的替代方法呢?

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

以下是违规代码。 我正在考虑在类型上做一个switch语句(因为它是一个有限的类型集合)并调用解析方法,虽然我不确定它是否会更快。

if(attributeRow["Value"]!=DBNull.Value)
    sample[attr] = attr.AttributeType == typeof(Guid)
                 ? new Guid(attributeRow["Value"].ToString())
                 : (IComparable)Convert.ChangeType(attributeRow["Value"],attr.AttributeType);

我不知道框架本身内的任何其他功能用于更改除Convert.ChangeType函数之外的类型(显然是显式转换)。

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

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

如果您正在寻找自己的功能,那么一个有趣的链接是在Peter Johnson的博客上:

Convert.ChangeType不处理nullables

请务必阅读该帖子的所有评论。

这是我更快的ChangeType版本。 我猜这个原理与@CraigTP建议的原理相同,但是它只适用于可空值的类型。

我的转换方法基于以下事实:值的类型更可能与目标类型兼容。 但是这种方法并不是为了方便而设计的。 这不是我想在紧密的循环中调用的东西。

我仍然在改变ChangeType,但我尽量选择退出。

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?);
}

我没有测试过更快,但这是动态铸造的另一种方式。 这是更普遍的,因为Convert.ChangeType()有一些限制,如你所见(Guids,Nullable类型)

value = (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFromInvariantString(str);

您可以滚动自己的ChangeType函数, ChangeType执行静态C风格的转换。 那将是我的方法。

我知道这听起来很疯狂但是,您可以使用Newtonsoft JSON.NET将您的对象转换为序列化字符串,然后从该字符串转换为任何其他类型。

var jsontemp = JsonConvert.SerializeObject(anyObject);
var ConvertedObject = JsonConvert.DeserializeObject(jsontemp, desiredType);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM