2014-12-08 156 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块中解决。修复后,现在需要几毫秒。

相关问题