2014-09-20 36 views
0

我的問題與c#中的數組有關,或者我認爲是數組。我對c#的基礎知識有很好的瞭解,但在此之後並不多。訪問數組中的對象的成員

我的任務是對下面一段代碼進行更改。該代碼從Web服務中檢索記錄列表,並將它們存儲在我可能錯誤地認爲是數組的內容中。林不知道如果數組可以有像下面的鍵或「列」(PurchaseDate,位置等..)。如果不是數組是什麼?

OO_WebService.Sale[] saleList= OO_webService_connection.GetSales().Sales; 

Console.Writeline(saleList[0].PurchaseDate); 
Console.Writeline(saleList[0].Location); 

Console.Writeline(saleList[1].PurchaseDate); 
Console.Writeline(saleList[1].Location); 

我還需要打印出所有鍵或列名。例如,還有另外20個密鑰以及PurchaseDate和Location。例如,我希望能夠使用for循環打印出所有關鍵名稱(PurchaseDate)及其值(2014年4月1日等)。我知道這是可能的JavaScript。我嘗試了幾次,但沒有實現它的運氣。任何建議不勝感激。

+0

是的,它是一個數組,Sale []',屬於Sale類。你可以通過反射來獲取名字,但爲什麼你需要它呢?你知道所有的屬性,只需使用[Visual Studio的intellisense](http://msdn.microsoft.com/en-us/library/vstudio/hcw1s69b.aspx)。 – 2014-09-20 20:56:10

+0

[]表示它是一個數組 – kidshaw 2014-09-20 21:00:28

回答

1

在這種情況下的數組包含Sale元素。 C#中的數組只是一個固定大小的元素集合,可以包含基本類型(例如您可能熟悉的int[])或者您正在處理的對象。

而是指saleList[0].PurchaseDate的,你可以重寫代碼:

for (int i = 0; i < saleList.Lenght; i++) 
{ 
    OO_WebService.Sale sale = saleList[i]; 
    Console.WriteLine(sale.PurchaseDate); 
    Console.WriteLine(sale.Location); 
} 

所以每一個元素,通過saleList訪問[指數]是Sale類的一個實例。我希望能爲你解決問題。

2

你需要使用反射...

var props = saleList.GetType().GetElementType().GetProperties(); 

foreach (var sale in saleList) 
{ 
    foreach (var p in props) 
    { 
     Console.WriteLine(p.Name + "=" + p.GetValue(sale,null)); 
    } 
    Console.WriteLine(); 
} 
+0

我想知道爲什麼C#初學者最常見的問題是關於反射。 – 2014-09-20 21:05:58

+1

@TimSchmelter也許這是隱藏在這句話'我知道它是可能的javascript' – EZI 2014-09-20 21:07:29

+0

你也可以'Console.WriteLine(「{0} = {1}」,p.Name,p.GetValue(sale,null ));'以避免字符串連接,可能會很慢。該方法轉換爲'Console.WriteLine(String.Format(「{0} = {1},p.Name,p.GetValue(sale,null));'。[String.Format上的MSDN](http:// msdn.microsoft.com/en-us/library/system.string.format(v=vs.110).aspx) – Spans 2014-09-20 21:09:26

0

你可以使用在Sale單擊鼠標右鍵,在菜單中選擇「轉到定義」。那會給你所有的財產。 如果Sale是動態的(例如,稍後可以具有更多或更少的屬性),則可以使用反射(如Tim所說)。

Type type = typeof(Sale); 
PropertyInfo[] info = type.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly); 
foreach (var i in info) 
{ 
    Debug.WriteLine(i.Name + " = " + i.GetValue(this, null)); 
} 

注意的GetValue返回值是object,也許需要被強制轉換爲正確的類型:這可以如下完成。 Debug.WriteLine會調用對象默認的ToString()執行。

+1

'如果銷售是動態的(例如,以後可以具有更多或更少的屬性),則可以使用反射'編號,如果它是*動態*,則不能使用反射 – EZI 2014-09-20 21:22:03

+0

我認爲這太籠統了http: //stackoverflow.com/questions/2634858/how-do-i-reflect-over-the-members-of-dynamic-object – 2014-09-21 00:03:37