gpt4 book ai didi

c# - 如何使用 AutoMapper 和 ConstructUsing 创建通用映射

转载 作者:太空宇宙 更新时间:2023-11-03 15:09:52 27 4
gpt4 key购买 nike

我有一个 map 配置:

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

有没有更简单的方法来做到这一点?

最佳答案

我认为可行,但话又说回来,我还没有针对广泛的输入集进行测试-

class ABC
{
public int MyProperty { get; set; }
public int MyProperty2 { get; set; }
}
static List<T> ConfigureMap<T>(Dictionary<int, T> input) where T : class
{
AutoMapper.Mapper.Initialize(cfg => cfg.CreateMap(input.GetType(), typeof(List<T>))
.ConstructUsing(Construct));

return Mapper.Map<List<T>>(input);

}

private static object Construct(object arg1, ResolutionContext arg2)
{
if (arg1 != null)
{
var val = arg1 as IDictionary;
var argument = val.GetType().GetGenericArguments()[1];
if (val != null)
{
var type = Activator.CreateInstance(typeof(List<>).MakeGenericType(argument));

foreach (var key in val.Keys)
{
((IList)type).Add(val[key]);
}

return type;
}
}

return null;
}

var so = new Dictionary<int, ABC> { { 1, new ABC { MyProperty = 10, MyProperty2 = 30 } } };
var dest = new List<ABC>();
var res = ConfigureMap<ABC>(so);

关于c# - 如何使用 AutoMapper 和 ConstructUsing 创建通用映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41724480/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com