/// <summary>Perform implicit casting</summary> public static Val ImplicitCast(Type t, Val val) { Type vt = val.Type; if (t == vt) { return(val); } if (ImplicitConversionTable.HasImplicitConversion(vt, t, out Type type)) { if (val.Value is IConvertible) { return(new Val(Convert.ChangeType(val.Value, t))); } else { MethodInfo mRead = typeof(Ops).GetMethod(nameof(Cast), BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static); MethodInfo gmRead = mRead.MakeGenericMethod(new Type[] { vt, t }); object o = gmRead.Invoke(null, new object[] { val.Value, type }); return(new Val(o)); } } else { throw new ValTypeMismatchException(val.Type, t); } }
/// <summary>Perform implicit casting towards a common type</summary> public static void ImplicitCast(ref Val v1, ref Val v2) { Type vt1 = v1.Type; Type vt2 = v2.Type; if (vt1 == vt2) { return; } if (ImplicitConversionTable.HasImplicitConversion(vt1, vt2, out _)) { v1 = ImplicitCast(vt2, v1); } else if (ImplicitConversionTable.HasImplicitConversion(vt2, vt1, out _)) { v2 = ImplicitCast(vt1, v2); } //else throw new ValTypeMismatchException(vt1, vt2); return; }