我需要转换此DTO
public class MyDTO
{
[JsonProperty("studentInfo")]
public StudentInfo studentInfo {get; set; }
public class StudentInfo
{
[JsonProperty("others")]
public ICollection<AnotherDTO[]> Others { get; set; }
}
public class AnotherDTO
{
[JsonProperty("name")]
public string name { get; set; }
}
}
到这个模型
public class MyModel
{
public StudentInfo studentInfo {get; set; }
public class StudentInfo
{
public ICollection<Another[]> Others { get; set; }
}
public class Another
{
public string name { get; set; }
}
}
我被ICollection挂了。以下是我试图填充ICollection Others的内容。
private static ICollection<MyModel.Another[]> getAnothers(MyDTO myDTO, MyModel myModel)
{
List<MyModel.Another> myList = new List<MyModel.Another>();
foreach(var x in myDTO.studentInfo.Others)
{
foreach(var y in x)
{
myList.Add(new MyModel.Another
{
name = y.name
});
}
}
}
MyModel.Another[] newList;
newList = myList.ToArray();
ICollection<MyDTO.AnotherDTO[]> ic = (ICollection<MyModel.Another[]>newList.Cast<MyModel.Another[]>().ToList();
最后一行给出了以下错误:
无法将MyModel类型的对象强制转换为MyModel []。
我将不胜感激。
答案 0 :(得分:3)
我建议使用AutoMapper而不是手动映射对象。 AutoMapper是一个简单的小型库,用于解决一个看似复杂的问题 - 摆脱将一个对象映射到另一个对象的代码。您还可以获取AutoMapper的Nuget包
只需定义对象的映射 -
Mapper.CreateMap<MyDTO, MyModel>();
..只需像这样映射对象 -
var myModelObject = Mapper.Map<MyModel>(myDtoObject);
请参阅this入门链接。
答案 1 :(得分:0)
您可以使用select语句转换集合。
var myDto = new MyDto
{
studentInfo = new MyModel.StudentInfo
{
Others = new List<AnotherDTO[]>
{
new[]
{
new AnotherDTO { Name = "a" },
new AnotherDTO { Name = "b" }
},
new[]
{
new AnotherDTO { Name = "x" },
new AnotherDTO { Name = "y" }
}
}
}
var model = new MyModel
{
studentInfo = new MyModel.StudentInfo
{
Others = dto.StudentInfo.Others
.Select(otherDtoArray =>
otherDtoArray
.Select(otherDto => new MyModel.Other {Name = otherDto.Name})).ToList()
}
答案 2 :(得分:0)
感谢大家的评论。我的主要问题是试图转换ICollection。
我最终将模型中的ICollection更改为List。它运作得很好。我无法像建议的那样使用AutoMapper,但我确实看到它的价值,就像我的情况一样。
答案 3 :(得分:-1)
你的代码中存在各种错误。
foreach(var x in myDTO.studentInfo.Others)
{
foreach(var y in x)
{
myList.Add(new MyModel.Another
{
name = y.name
});
}
为什么你需要第二个foreach循环?你的第一个foreach循环已经遍历你的Others(类型:ICollection)。每个“x”都是AnotherDTO的一个实例。
其次,以下是完全错误的:
MyModel.Another[] newList;
newList = myList.ToArray();
ICollection<MyDTO.AnotherDTO[]> ic = (ICollection<MyModel.Another[]>newList.Cast<MyModel.Another[]>().ToList();
MyList
已经是一个列表。然后,您尝试将其转换为数组,然后返回列表。这样做没有意义。
另外,您可能根本就不使用ICollection
。它什么都不重要。只需使用List
。
也不要用简单的字母'a','b','x','y'等命名变量......一旦你进入就业市场,你的同事就会受到骚扰
以下是您的代码的更正版本:
public class SomeClass
{
public static List<Another> MapAnotherDtoToAnother(List<AnotherDTO> others)
{
List<Another> anotherList = new List<Another>();
foreach(var anotherDto in others)
{
Another another = new Another();
/* Populate fields of `another` whatever they are from `anotherDto` */
another.FirstName = anotherDto.FirstName;
anotherList.Add(another);
}
return anotherList;
}
}
要将ICollection转换为List,请执行以下操作:
/* Convert your ICollection to a List */
List<AnotherDTO> AnotherDTOList = myDto.StudentInfo.Others.Cast<AnotherDTO>().ToList()
/* Use your static function get your non-dto counterpart */
List<Another> anothers = SomeClass.MapAnotherDtoToAnother(AnotherDTOList);
希望它有所帮助。 祝你好运!