[英]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.