Beispiel #1
0
        /// <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);
            }
        }
Beispiel #2
0
        /// <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;
        }