将对象数组转换为不同的对象数组

时间:2011-12-06 15:41:44

标签: c# casting

我从网络服务中撤回有关位置的信息。该服务返回一个WebObjectsDTOs数组,其中包含所有对象。对象可以是不同类型的,但在这种情况下,我只请求MlaLocation类型的对象。然后我需要按地点名称排序。我遇到的问题是我无法在searchResult.WebObjectDTOs上执行orderby,因为它是基础对象,无法访问位置名称。

我认为我的解决方案是将searchResult.WebObjectDTOs转换为MlaLocationDTO[],因为searchResult只返回MlaLocationDTO数组。但是我在调​​试中看到的是mlaLocations被设置为null,即使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 个答案:

答案 0 :(得分:1)

您应该能够将数组转换为类型;

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

请参阅Enumerable.Cast Method

答案 1 :(得分:1)

您无法执行此转换,因为在这种情况下,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,但除非数组本身是这些对象的数组,否则无法执行此转换。正如您在代码中看到的那样,它会在运行时爆炸。

至于解决方案,如果 MlaLocationDTOWebObjectDTO具有继承关系,其中MlaLocationDTO : WebObjectDTO if 数组中的每个对象实际上是 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>

答案 2 :(得分:0)

您可以使用LINQ来执行此操作:

searchResult.WebObjectDTOs.Select(d => d as MlaLocationDTO).ToArray();

答案 3 :(得分:0)

由于您的收藏集包含许多其他类型的对象,因此您可以使用OfType method安全地过滤MlaLocationDTO个对象:

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

如果所有对象都是MlaLocationDTO,则可以使用Cast method代替:

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

答案 4 :(得分:0)

而不是

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

试试这个:

MlaLocationDTO[] mlaLocations = searchResult.WebObjectDTOs.Cast<MlaLocationDTO>().ToArray();

答案 5 :(得分:0)

怎么样:

IEnumerable<MlaLocationDTO> castedResults = searchResult.WebObjectDTOs.Cast<MlaLocationDTO>();

答案 6 :(得分:0)

您是否尝试过循环WebObjectDTO并向mlaLocations添加值: 可能是:

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

或类似的东西?