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)); }
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); }
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); }