private static Action <TObject, PNode> BuildDeserializeMethod(PropertyInfo property, IPlistConverter propertyValueConverter) { const string deserializeMethodName = nameof(IPlistConverter <object> .Deserialize); var instance = Expression.Parameter(typeof(TObject)); var parameter = Expression.Parameter(typeof(PNode)); var converterType = propertyValueConverter.GetType(); var deserializeMethod = converterType.GetMethod(deserializeMethodName); if (deserializeMethod == null) { throw new InvalidOperationException($"Bad converter for type {property.PropertyType}"); } var converter = Expression.Constant(propertyValueConverter, converterType); var propertyValue = Expression.Call(converter, deserializeMethod, parameter); var body = Expression.Assign(Expression.Property(instance, property), propertyValue); return(Expression .Lambda <Action <TObject, PNode> >(body, instance, parameter) .Compile()); }
private void AddDeserializeMethodForProperty(PropertyInfo propertyInfo, IPlistConverter plistConverter) { _deserializeMethods.Add(propertyInfo.Name, BuildDeserializeMethod(propertyInfo, plistConverter)); }
public ArrayConverter(IPlistConverter <TElement> elementConverter) { _elementConverter = elementConverter; }
public DictionaryConverter(IPlistConverter <TVal> elementConverter) { _elementConverter = elementConverter; }
public ListConverter(IPlistConverter <TVal> elementConverter) { _elementConverter = elementConverter; }