using System.Collections;
using System.Collections.Generic;
using Google.Protobuf.Collections;
public static void Main()
var conf = new MapperConfiguration(ce =>
ce.CreateMap<A, B>().ReverseMap();
ce.CreateMap(typeof(IEnumerable<>), typeof(RepeatedField<>)).ConvertUsing(typeof(EnumerableToRepeatedFieldTypeConverter<,>));
ce.CreateMap(typeof(RepeatedField<>), typeof(List<>)).ConvertUsing(typeof(RepeatedFieldToListTypeConverter<,>));
var mapper = new Mapper(conf);
var initialList = new List<A>() { new A() { Name = "John" }, new A() { Name = "Peter" } };
foreach (var item in initialList)
Console.WriteLine(string.Format("List<A>: Item Name = \"{0}\"", item.Name));
var repeatedField = mapper.DefaultContext.Mapper.Map<RepeatedField<B>>(initialList);
foreach (var item in repeatedField)
Console.WriteLine(string.Format("RepeatedList<B>: Item Name = \"{0}\"", item.Name));
var finalList = mapper.DefaultContext.Mapper.Map<List<A>>(repeatedField);
foreach (var item in finalList)
Console.WriteLine(string.Format("List<A>: Item Name = \"{0}\"", item.Name));
public string Name { get; set; }
public string Name { get; set; }
private class EnumerableToRepeatedFieldTypeConverter<TITemSource, TITemDest> : ITypeConverter<IEnumerable<TITemSource>, RepeatedField<TITemDest>>
public RepeatedField<TITemDest> Convert(IEnumerable<TITemSource> source, RepeatedField<TITemDest> destination, ResolutionContext context)
destination = destination ?? new RepeatedField<TITemDest>();
foreach (var item in source)
destination.Add(context.Mapper.Map<TITemDest>(item));
private class RepeatedFieldToListTypeConverter<TITemSource, TITemDest> : ITypeConverter<RepeatedField<TITemSource>, List<TITemDest>>
public List<TITemDest> Convert(RepeatedField<TITemSource> source, List<TITemDest> destination, ResolutionContext context)
destination = destination ?? new List<TITemDest>();
foreach (var item in source)
destination.Add(context.Mapper.Map<TITemDest>(item));