是否有任何具有良好性能的通用类型转换器

本文关键字:类型 转换器 类型转换 性能 任何具 是否 | 更新日期: 2023-09-27 18:33:26

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

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

是否有任何具有良好性能的通用类型转换器

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

return Convert.ChangeType(value, desiredType);

因此,在转换 121 GUID 时出现错误并在 catch 块中解决。 修复后,现在需要几毫秒。