2014-12-08 128 views
1

我在運行時使用以下通用方法進行類型轉換。但這需要時間並影響性能。是否有任何具有良好性能的泛型TypeConvertor?

對於381值轉換花費9922.71毫秒

是否有改善這個任何最好的方法?

public static void test() 
    { 
     Stopwatch watch = new Stopwatch(); 
     watch.Start(); 

     for (int i = 0; i < 200; i++) 
     { 
      var xi = Common.CoerceValue(typeof(Guid), typeof(string), null, Guid.NewGuid().ToString()); 
     } 

     watch.Stop(); 

     double timetaken = watch.Elapsed.TotalMilliseconds; 
    } 

public static object CoerceValue(Type desiredType, Type valueType, object oldValue, object value) 
{ 
    if (desiredType.Equals(valueType)) 
    { 
     // types match, just return value 
     return value; 
    } 
    else 
    { 
     if (desiredType.IsGenericType) 
     { 
      if (desiredType.GetGenericTypeDefinition() == typeof(Nullable<>)) 
      { 
       if (value == null) 
        return null; 
       else if (valueType.Equals(typeof(string)) && System.Convert.ToString(value) == string.Empty) 
        return null; 
      } 

      desiredType = GetPropertyType(desiredType); 
     } 

     if (desiredType.IsEnum && (valueType.Equals(typeof(string)) || Enum.GetUnderlyingType(desiredType).Equals(valueType))) 
      return System.Enum.Parse(desiredType, value.ToString()); 

     if ((desiredType.IsPrimitive || desiredType.Equals(typeof(decimal))) && 
        valueType.Equals(typeof(string)) && string.IsNullOrEmpty((string)value)) 
      value = 0; 

     try 
     { 
      if (desiredType.Equals(typeof(string)) && value != null) 
      { 
       return value.ToString(); 
      } 
      else if (desiredType.Equals(typeof(Boolean)) && valueType.Equals(typeof(string))) 
      { 
       return "1" == Convert.ToString(value) || "TRUE" == Convert.ToString(value).ToUpper1(); 
      } 
      else 
      { 
       if (desiredType.Equals(typeof(Guid)) && DBUtility.DBType == Core.Enums.DataBaseType.ORACLE) 
       { 
        TypeConverter cnv = TypeDescriptor.GetConverter(desiredType); 
         return cnv.ConvertFrom(value); 
       } 
       else 
        return Convert.ChangeType(value, desiredType); 
      } 
     } 
     catch 
     { 
      TypeConverter cnv = TypeDescriptor.GetConverter(desiredType); 
      if (cnv != null && cnv.CanConvertFrom(valueType)) 
       return cnv.ConvertFrom(value); 
      else 
       throw; 
     } 
    } 
} 

public static Type GetPropertyType(Type propertyType) 
{ 
    Type type = propertyType; 
    if (type.IsGenericType && 
      (type.GetGenericTypeDefinition() == typeof(Nullable<>))) 
     return Nullable.GetUnderlyingType(type); 
    return type; 
} 
+0

如果代碼工作,你希望它爲優化審覈,你應該張貼此作爲[代碼審查(http://codereview.stackexchange.com/) – 2014-12-08 09:13:45

+0

確定的問題。我將在codereview中發佈它。大部分時間Guid(字符串)轉換爲Guid轉換。幾乎90%的時間用於這種轉換。 – anand 2014-12-08 10:29:43

+0

@anand你解析多少個guid?我的電腦可以使用'Guid.Parse'每秒解析200萬個GUID。 – CodesInChaos 2014-12-08 11:12:00

回答

0

在guid(字符串)向guid類型拋出轉換錯誤的代碼中存在一個錯誤。

return Convert.ChangeType(value, desiredType); 

所以雖然轉換121個GUID得到錯誤,並在catch塊中解決。修復後,現在需要幾毫秒。

相關問題