Exemplo n.º 1
0
 public static bool DynamicCast <T> (ref T dst, object src, Type srcType, DynamicCastFlags flags = DynamicCastFlags.None)
 {
     if (src == null)
     {
         return(false);
     }
     if (srcType == null)
         throw new ArgumentNullException(nameof(srcType)); }
Exemplo n.º 2
0
        public static bool DynamicCast <T> (ref T dst, object src, Type srcType, DynamicCastFlags flags = DynamicCastFlags.None)
        {
            if (src == null)
            {
                return(false);
            }
            if (srcType == null)
            {
                throw new ArgumentNullException(nameof(srcType));
            }
            object o = null;

            if (DynamicCast(ref o, src, srcType, typeof(T), flags))
            {
                dst = (T)o;
                return(true);
            }
            return(false);
        }
Exemplo n.º 3
0
        unsafe static bool DynamicCast(ref object dest, object src, Type srcType, Type destType, DynamicCastFlags flags)
        {
            var destPtr      = IntPtr.Zero;
            var srcPtr       = IntPtr.Zero;
            var srcMetaType  = StructMarshal.Marshaler.Metatypeof(srcType);
            var destMetaType = StructMarshal.Marshaler.Metatypeof(destType);

            if (src is ISwiftObject)
            {
                srcPtr = ((ISwiftObject)src).SwiftObject;
            }
            else
            {
                var srcData = stackalloc byte [StructMarshal.Marshaler.Sizeof(srcType)];
                srcPtr = new IntPtr(srcData);
                StructMarshal.Marshaler.ToSwift(src, srcPtr);
            }
            int size = StructMarshal.Marshaler.Sizeof(destType);

            if (size > 0)
            {
                var destData = stackalloc byte [size];
                destPtr = new IntPtr(destData);
            }
            if (swift_dynamicCast(destPtr, srcPtr, srcMetaType, destMetaType, (nint)(int)flags))
            {
                StructMarshal.Marshaler.ReleaseSwiftPointer(srcType, srcPtr);
                if (size > 0)
                {
                    if (typeof(ISwiftObject).IsAssignableFrom(destType))
                    {
                        var objptr = Marshal.ReadIntPtr(destPtr);
                        dest = SwiftObjectRegistry.Registry.CSObjectForSwiftObject(objptr, destType);
                    }
                    else
                    {
                        dest = StructMarshal.Marshaler.ToNet(destPtr, destType);
                    }
                    return(true);
                }
            }
            return(false);
        }