当前位置: 首页 > 编程语言 > C#

更快版Convert.ChangeType分享

时间:2023-04-10 14:10:32 C#

更快版Convert.ChangeType在我的应用程序中,我经常调用Convert.ChangeType将值转换为动态加载的类型。但是,在使用ANTS进行分析后,我发现此Convert.ChangeType似乎占用了很大一部分时间(由于被如此频繁地调用)。有人对此有更快的选择吗?此时我有一个包含目标的类型对象和一个包含值的字符串。下面是有问题的代码。我正在考虑对类型执行switch语句(因为它是类型的有限集合)并调用resolve方法,尽管我不确定它是否会更快。如果(attributeRow[“Value”]!=DBNull.Value)样本[attr]=attr.AttributeType==typeof(Guid)?新的Guid(attributeRow["Value"].ToString()):(IComparable)Convert.ChangeType(attributeRow["Value"],attr.AttributeType);除了Convert.ChangeType函数(显然是显式转换)之外,我不知道框架本身用于更改类型的任何其他函数。为此,我认为改进它的唯一其他方法是推出针对您的特定情况(如果可能)优化的自己的ChangeType函数。您提到您使用的类型数量有限,也许您处理的一种类型多于其他类型?是的,您的ChangeType函数可以优化为首先尝试此特定转换,只有在失败时,才尝试其他转换。您提到了尝试切换样式的代码块,并且可以将相同的方法(尝试最常见的类型)应用于该代码块。至于它是否会更快取决于您正在处理的数据(以及您正在转换/转换的类型的频率/可变性),唯一真正的衡量方法是尝试对其进行分析以与Convert.ChangeType方法。如果您正在寻找自己的功能,PeterJohnson的博客上有一个有趣的链接:Convert.ChangeType不处理可空值请务必阅读该帖子的所有评论。这是我的ChangeType的更快版本。我想原理与@CraigTP所建议的相同,但它仅适用于具有可为空值的类型。我的转换方法是基于这样一个事实,即值的类型更可能与目标类型兼容。但是这种方法并不是为了方便而设计的。这不是我想在一个紧密的循环中调用的东西。我仍在使用ChangeType,但我尽量选择退出。公共静态T?ToOrDefault(objectvalue)whereT:struct,IConvertible{varx=valueasT?;如果(x.HasValue){返回x;}if(value==null||Convert.IsDBNull(value)){returnnull;}try{return(T)Convert.ChangeType(value,typeof(T),CultureInfo.InvariantCulture);}catch(InvalidCastException){}catch(FormatException){}catch(OverflowException){}catch(ArgumentException){}returndefault(T?);您可以滚动自己的ChangeType函数,ChangeType执行静态C样式转换。这将是我的方法。我没有测试得更快,但这是动态投射的另一种方式。这个比较笼统,因为Convert.ChangeType()有一些限制,可以看到(Guids,Nullabletypes)以上就是C#学习教程的全部内容:FasterversionofConvert.ChangeType,如果对大家有用的话并且需要了解更多C#学习教程,希望大家多多关注—value=(T)TypeDescriptor.GetConverter(typeof(T)).ConvertFromInvariantString(str);本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: