Привести массив объектов к другому массиву объектов - PullRequest
2 голосов
/ 06 декабря 2011

Я получаю информацию о местах из веб-службы.Служба возвращает массив WebObjectsDTOs, который содержит все объекты.Объекты могут быть разных типов, но в этом случае я запрашиваю только объекты типа MlaLocation.Затем мне нужно заказать название места.Проблема, с которой я столкнулся, заключалась в том, что я не могу выполнить заказ на searchResult.WebObjectDTOs, потому что это базовый объект и не имеет доступа к имени местоположения.

Я думал, что мое решение будет заключаться в приведении searchResult.WebObjectDTOs к MlaLocationDTO[], поскольку searchResult возвращает только массив MlaLocationDTO.Но то, что я вижу в отладке, это то, что mlaLocations устанавливается как ноль, даже если в searchResult.WebObjectDTOs есть объекты.

MlaWebObjectServiceClient svc = new MlaWebObjectServiceClient();
SearchRequest searchRequest = new SearchRequest(){
    OperatingCompanyId = Guid.Parse("e4be5383-03d0-4a99-9613-6238dd2396ad"), 
    WebObjectType = "MlaLocation"
};
SearchResult searchResult = svc.GetMlaWebObjects(searchRequest);
MlaLocationDTO[] mlaLocations = searchResult.WebObjectDTOs as MlaLocationDTO[];
rptLocationsList.DataSource = mlaLocations.OrderBy(m => m.Name);
rptLocationsList.DataBind();

Ответы [ 7 ]

1 голос
/ 06 декабря 2011

Вы не можете выполнить это приведение, потому что в этом случае массив WebObjectDTO не является массивом MlaLocationDTO. Рассмотрим более простой пример, предположим, что у вас есть

class Alpha { }
class Beta : Alpha { } 

Alpha[] alphas = new Beta[10]; // supported via array variance
Beta[] betas = (Beta[])alphas; // legal cast, the array is actually of this type

Alpha[] alphas2 = new Alpha[10];
Beta[] betas2 = (Beta[])alphas2; // not legal, the array isn't of this type

Каждый элемент в массиве вполне может быть MlaLocationDTO, но если сам массив не является массивом этих объектов, вы не сможете выполнить это приведение. Он взорвется во время выполнения, как вы видели в своем коде.

Что касается решений, , если MlaLocationDTO имеет отношение наследования с WebObjectDTO, где MlaLocationDTO : WebObjectDTO и , если каждый объект в массиве фактически a MlaLocationDTO, вы можете разыграть каждый отдельный элемент.

var locations = searchResult.WebObjectDTOs.Cast<MlaLocationDTO>();

Однако, если местоположения на самом деле не относятся к этому типу объектов, вам просто нужно определить преобразование самостоятельно. Это достаточно просто сделать в форме запроса.

var locations = from location in searchResult.WebObjectDTOs
                select new MlaLocationDTO
                {
                    Name = ...,
                    Id = ...,
                    /* etc. */
                };

При необходимости включите .ToArray() в любую из форм запроса, если вам нужен результат массива. Тип будет тогда MlaLocationDTO[]. Без вызова ToArray() это будет просто IEnumerable<MlaLocationDTO>.

1 голос
/ 06 декабря 2011

Вы должны быть в состоянии привести ваш массив к типу;

var mlaLocations = searchResult.WebObjectDTOs.Cast<MlaLocationDTO>();

См. Method"> Enumerable.Cast Method

0 голосов
/ 06 декабря 2011

Вы пробовали циклически проходить через WebObjectDTO и добавлять значения в mlaLocations: Может быть:

 for(int objIndex = 0; objIndex <= WebObjectDTOs.Count - 1; objIndex++)
 {
      mlaLocations[objIndex].Add(WebObjectDTOs[objIndex]);
 }

или что-то подобное?

0 голосов
/ 06 декабря 2011

Как насчет:

IEnumerable<MlaLocationDTO> castedResults = searchResult.WebObjectDTOs.Cast<MlaLocationDTO>();
0 голосов
/ 06 декабря 2011

вместо

MlaLocationDTO[] mlaLocations = searchResult.WebObjectDTOs as MlaLocationDTO[];

попробуйте это:

MlaLocationDTO[] mlaLocations = searchResult.WebObjectDTOs.Cast<MlaLocationDTO>().ToArray();
0 голосов
/ 06 декабря 2011

Поскольку в вашей коллекции много других типов объектов, вы можете безопасно фильтровать MlaLocationDTO объекты, используя OfType метод :

var mlaLocations = searchResult.WebObjectDTOs.OfType<MlaLocationDTO>();

Если все объекты были MlaLocationDTO, вы можете использовать Cast метод вместо:

var mlaLocations = searchResult.WebObjectDTOs.Cast<MlaLocationDTO>();
0 голосов
/ 06 декабря 2011

Вы можете использовать LINQ для этого:

searchResult.WebObjectDTOs.Select(d => d as MlaLocationDTO).ToArray();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...