是否有任何具有良好性能的通用类型转换器
本文关键字:类型 转换器 类型转换 性能 任何具 是否 | 更新日期: 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 块中解决。 修复后,现在需要几毫秒。