是否有任何具有良好性能的通用TypeConvertor?

时间:2014-12-08 09:10:12

标签: c# type-conversion

我在运行时使用以下泛型方法进行类型转换。但这需要时间并且会对性能产生影响。

对于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;
}

1 个答案:

答案 0 :(得分:0)

代码中存在将guid(字符串)转换为guid类型的错误。

return Convert.ChangeType(value, desiredType);

所以转换121个guid时遇到错误并在catch块中解决。修复后,现在需要几毫秒。