示例#1
0
        /// <summary>
        /// Registers specified decoder (unmarshaller)
        /// <para>Python.NET will pick suitable encoder/decoder registered first</para>
        /// </summary>
        public static void RegisterDecoder(IPyObjectDecoder decoder)
        {
            if (decoder == null)
            {
                throw new ArgumentNullException(nameof(decoder));
            }

            lock (decoders)
            {
                decoders.Add(decoder);
            }
        }
示例#2
0
        /// <summary>
        /// Gets a concrete instance of <see cref="IPyObjectDecoder"/>
        /// (potentially selecting one from a collection),
        /// that can decode from <paramref name="objectType"/> to <paramref name="targetType"/>,
        /// or <c>null</c> if a matching decoder can not be found.
        /// </summary>
        public static IPyObjectDecoder GetDecoder(
            this IPyObjectDecoder decoder,
            PyObject objectType, Type targetType)
        {
            if (decoder is null)
            {
                throw new ArgumentNullException(nameof(decoder));
            }

            if (decoder is IEnumerable <IPyObjectDecoder> composite)
            {
                return(composite
                       .Select(nestedDecoder => nestedDecoder.GetDecoder(objectType, targetType))
                       .FirstOrDefault(d => d != null));
            }

            return(decoder.CanDecode(objectType, targetType) ? decoder : null);
        }