2015-10-14 2 views
2

Мне нужно преобразовать этот DTOC# добавить массив объектов в 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

Вместо того, чтобы вручную отображать объект, я бы предложил использовать AutoMapper. AutoMapper - это простая небольшая библиотека, созданная для решения обманчиво сложной проблемы - избавления от кода, который сопоставил один объект с другим. Вы также можете получить пакет NuGet для AutoMapper

Просто определить отображение для объектов -

Mapper.CreateMap<MyDTO, MyModel>(); 

..и просто отобразить объект, как это -

var myModelObject = Mapper.Map<MyModel>(myDtoObject); 

Пожалуйста, обратитесь this ссылку Начало работы ,

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() 
     } 
-1

В коде есть все виды ошибок.

foreach(var x in myDTO.studentInfo.Others) 
{ 
    foreach(var y in x) 
    { 
    myList.Add(new MyModel.Another 
    { 
     name = y.name 
    }); 
    } 

Зачем вам нужен второй цикл foreach? Ваш первый цикл foreach уже перебирает ваши другие (тип: ICollection). Каждый «х» является экземпляром 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 в список просто сделать:

/* 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); 

Надеется, что это помогает. Удачи!

+0

Другие - это 'ICollection ' (т. Е. Список массивов) Является ли это хорошим дизайнерским решением, это другой вопрос, но для кода в его нынешнем виде он абсолютно нуждается во втором foreach. –

0

Спасибо за ваши комментарии. Моя основная проблема заключалась в попытке конвертировать ICollection.

Я закончил тем, что изменил ICollection в своей модели, чтобы просто List. И это хорошо работает. Я не могу использовать AutoMapper, как было предложено, но я вижу его значение для случая, подобного моему.

Смежные вопросы