我在运行时使用以下泛型方法进行类型转换。但这需要时间并且会对性能产生影响。
对于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 :(得分:0)
代码中存在将guid(字符串)转换为guid类型的错误。
return Convert.ChangeType(value, desiredType);
所以转换121个guid时遇到错误并在catch块中解决。修复后,现在需要几毫秒。