c#将对象数组添加到ICollection - 转换dto - >模型

时间:2015-10-14 03:43:04

标签: c# dto icollection

我需要转换此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 []。

我将不胜感激。

4 个答案:

答案 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);

希望它有所帮助。 祝你好运!