gpt4 book ai didi

c# - 将包装的集合映射到列表

转载 作者:行者123 更新时间:2023-11-30 17:29:15 25 4
gpt4 key购买 nike

Web API 将集合包装在一个(未命名的)对象中是很常见的,通常带有附加字段。

// GET http://api.example.com/foos/all
{
"success": true,
"count": 3,
"foos": [
{ id: "foo1" },
{ id: "foo2" },
{ id: "foo3" }
]
}

在使用 Json.NET 的 C# 中,这将映射到如下内容:

class FooData {
public string Id { get; set; }
}

class FooDataWrapper {
public bool Success { get; set; }
public int Count { get; set; }
public FooData[] Foos { get; set; }
}

...

var fooData = JsonConvert.DeserializeObject<FooDataWrapper>("{ ... }");

我不想在我的代码库的其余部分周围传递 FooDataWrapper,因此我通常创建一个实体类,它只包含 foos 内容而没有其他字段。

public class Foo { // entity model
public string Id { get; set; }
}

我现在可以使用 AutoMapper 将 FooDataWrapper 的实例映射到 Foo 的列表吗?

FooDataWrapper fooDataWrapper = JsonConvert.DeserializeObject<FooDataWrapper>("{ ... }");
List<Foo> foos = Mapper.Map<FooDataWrapper, List<Foo>>(fooDataWrapper);

CreateMap 会是什么样子才能完成这项工作?

请忽略 FooFooData 在这个例子中看起来是一样的。现实世界通常没有看起来与实体对象完全一样的 DTO 对象。

最佳答案

一旦你知道怎么做,这实际上很容易做到。

您需要创建两个 map :

  1. 一个用于映射的规则映射 FooDataFoo
  2. 一个用于映射的辅助 map FooDataWrapperList<Foo>

对于辅助映射,您必须使用自定义类型转换器,因为您不能使用 ForMember选择整个目标对象。

自定义类型转换器可以是一个 lambda 并且只是做 Mapper.Map(FooData[], List<Foo>) .

// classic mapping
CreateMap<FooData, Foo>();

// helper mapping
CreateMap<FooDataWrapper, List<Foo>>()
.ConvertUsing((wrapper, list, context) => context.Mapper.Map(wrapper.Foos, list, context));

您甚至可以在类型转换器中使用包装器对象中的其他属性。这是一个如何使用包装器的 Count 的示例属性设置结果列表的初始容量。

CreateMap<FooDataWrapper, List<Foo>>()
.ConvertUsing((wrapper, list, context) => {
var destination = list ?? new List<Foo>(capacity: wrapper.Count);
return context.Mapper.Map(wrapper.Foos, destination, context);
});

关于c# - 将包装的集合映射到列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51417176/

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