我从网络服务中撤回有关位置的信息。该服务返回一个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();
答案 0 :(得分:1)
您应该能够将数组转换为类型;
var mlaLocations = searchResult.WebObjectDTOs.Cast<MlaLocationDTO>();
答案 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
,但除非数组本身是这些对象的数组,否则无法执行此转换。正如您在代码中看到的那样,它会在运行时爆炸。
至于解决方案,如果 MlaLocationDTO
与WebObjectDTO
具有继承关系,其中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]);
}
或类似的东西?