2011-12-06 142 views
2

我正在從web服務中取回有關位置的信息。該服務返回一個包含所有對象的WebObjectsDTOs數組。對象可以是不同的類型,但在這種情況下,我只請求MlaLocation類型的對象。然後我需要按地點名稱排序。我遇到的問題是我無法在searchResult.WebObjectDTOs上執行orderby,因爲它是基礎對象,無法訪問位置名稱。將對象陣列轉換爲不同的對象陣列

我以爲我的解決方案是將searchResult.WebObjectDTOs轉換爲MlaLocationDTO[],因爲searchResult只返回一個MlaLocationDTO的數組。但是我在調​​試中看到被設置爲空,即使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(); 
+1

C#中的數組轉換很奇怪,並且據我所知,您必須遍歷數組中的每個項並將它們直接轉換爲新數組。 –

+0

@ RichardJ.RossIII你不需要迭代。請參閱我答案中的鏈接。例如,'object [] a = new string [] {「a」,「b」,「c」}'是合法的。 – phoog

+0

@phoog正確的向下投射是好的,但向上投射是不同的,因爲它不會隱含地工作。 –

回答

0

由於您的收藏有許多其他類型的對象,你可以使用OfType method安全過濾MlaLocationDTO對象:

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

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

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

你可以使用LINQ來做到這一點:

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

而不是

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

試試這個:

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

如何:

IEnumerable<MlaLocationDTO> castedResults = searchResult.WebObjectDTOs.Cast<MlaLocationDTO>(); 
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如果陣列中的每個對象是實際上一個MlaLocationDTO繼承關係,可以投每個單獨的元件。

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

但是,如果位置不是真正的這種類型的對象,那麼您只需要自己定義轉換。這很容易以查詢的形式做到這一點。

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

如果您需要數組結果,可以在任一查詢表單上選擇包含.ToArray()。該類型將是MlaLocationDTO[]。 Sans ToArray()調用,它只是IEnumerable<MlaLocationDTO>

0

您是否嘗試過通過WebObjectDTOs循環和增加值mlaLocations: 可能是:

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

或類似的東西?