У меня есть настройки карты:Как создать родовое отображение с AutoMapper и ConstructUsing
Mapper.Initialize(cfg =>
{
cfg.CreateMap<IDictionary<int, MyType1>, List<MyType1>>().ConstructUsing(
x0 => x0?.OrderBy(x => x.Key).Select(x => x.Value).ToList());
});
Как я могу изменить это, чтобы работать с «все MyTypes»?
Я хочу, чтобы конвертировать из IDictionary<int, T>
в List<T>
для любого типа T.
Я нашел очень некрасиво решение:
cfg.CreateMap(typeof(IDictionary<,>), typeof(List<>)).ConstructUsing(
x0 =>
{
if (x0 == null)
{
return null;
}
var dict = (IEnumerable)x0;
var type = x0.GetType().GetGenericArguments()[1];
var list = (IList)Activator.CreateInstance(typeof(List<>).MakeGenericType(type));
CastDictionaryEntry(dict).OrderBy(x => x.Key).ForEach(x => list.Add(x.Value));
return list;
}
);
и:
static IEnumerable<DictionaryEntry> CastDictionaryEntry(IEnumerable dict)
{
foreach (var item in dict)
{
yield return (DictionaryEntry)item;
}
}
Есть ли более простой способ сделать это?
Что случилось с 'dict.Values'? –
Я хочу сортировать dict.Values по ключу в списке результатов. , так что если Dictionalry содержит: {1, "a"}, {3, "b"}, {2, "c"}, результат должен быть {"a", "c", "b"}, а не случайным , Вторая проблема заключается в том, что IEnumerable не имеет свойства Values. Как я могу получить доступ к свойству «Значения» IDictionary? –
zgabi
Я не могу отдать его IDictionary (не общий), потому что мой объект Dictionary не является IDictionary (например, PersistentGenericMap NHibernate) – zgabi