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