static int check_type_with_score (Type from, Type to)
{
if (from == null)
return to.IsValueType ? -1 : 0;
if (from == to)
return 0;
if (to == typeof (object))
return 4;
TypeCode fromt = Type.GetTypeCode (from);
TypeCode tot = Type.GetTypeCode (to);
switch (fromt) {
case TypeCode.Char:
switch (tot) {
case TypeCode.UInt16:
return 0;
case TypeCode.UInt32:
case TypeCode.Int32:
case TypeCode.UInt64:
case TypeCode.Int64:
case TypeCode.Single:
case TypeCode.Double:
return 2;
}
return -1;
case TypeCode.Byte:
switch (tot) {
case TypeCode.Char:
case TypeCode.UInt16:
case TypeCode.Int16:
case TypeCode.UInt32:
case TypeCode.Int32:
case TypeCode.UInt64:
case TypeCode.Int64:
case TypeCode.Single:
case TypeCode.Double:
return 2;
}
return (from.IsEnum && to == typeof (Enum)) ? 1 : -1;
case TypeCode.SByte:
switch (tot) {
case TypeCode.Int16:
case TypeCode.Int32:
case TypeCode.Int64:
case TypeCode.Single:
case TypeCode.Double:
return 2;
}
return (from.IsEnum && to == typeof (Enum)) ? 1 : -1;
case TypeCode.UInt16:
switch (tot) {
case TypeCode.UInt32:
case TypeCode.Int32:
case TypeCode.UInt64:
case TypeCode.Int64:
case TypeCode.Single:
case TypeCode.Double:
return 2;
}
return (from.IsEnum && to == typeof (Enum)) ? 1 : -1;
case TypeCode.Int16:
switch (tot) {
case TypeCode.Int32:
case TypeCode.Int64:
case TypeCode.Single:
case TypeCode.Double:
return 2;
}
return (from.IsEnum && to == typeof (Enum)) ? 1 : -1;
case TypeCode.UInt32:
switch (tot) {
case TypeCode.UInt64:
case TypeCode.Int64:
case TypeCode.Single:
case TypeCode.Double:
return 2;
}
return (from.IsEnum && to == typeof (Enum)) ? 1 : -1;
case TypeCode.Int32:
switch (tot) {
case TypeCode.Int64:
case TypeCode.Single:
case TypeCode.Double:
return 2;
}
return (from.IsEnum && to == typeof (Enum)) ? 1 : -1;
case TypeCode.UInt64:
case TypeCode.Int64:
switch (tot) {
case TypeCode.Single:
case TypeCode.Double:
return 2;
}
return (from.IsEnum && to == typeof (Enum)) ? 1 : -1;
case TypeCode.Single:
return tot == TypeCode.Double ? 2 : -1;
default:
return (to.IsAssignableFrom (from)) ? 3 : -1;
}
}
}