簡體   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