【问题标题】:Is there any generic TypeConvertor with good performance?是否有任何性能良好的通用 TypeConvertor?
【发布时间】:2014-12-08 09:10:11
【问题描述】:

我在运行时使用以下通用方法进行类型转换。但这需要时间,而且有点影响性能。

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

【问题讨论】:

  • 如果代码有效并且您希望对其进行审查以进行优化,您应该将其作为问题发布到codereview
  • 好的。我会在codereview中发布。 Guid(字符串)到 Guid 的转换需要大部分时间。几乎 90% 的时间用于此转换。
  • @anand 你在解析多少个 guid?我的计算机每秒可以使用Guid.Parse 解析 200 万个 GUID。
  • @CodesInChaos,在函数中,将字符串转换为guid时,出现转换错误,并在catch块中处理。这会降低性能。有 121 个 guid 转换,抛出 121 个转换错误 :(。这导致了问题。
  • @anand 如果您没有附加调试器,异常不会那么昂贵。

标签: c# type-conversion


【解决方案1】:

代码中存在错误,导致 guid(字符串)到 guid 类型的转换错误。

return Convert.ChangeType(value, desiredType);

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

【讨论】:

    猜你喜欢
    • 2011-07-18
    • 1970-01-01
    • 2020-10-30
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-19
    • 1970-01-01
    相关资源
    最近更新 更多