2014-09-20 6 views
0

Мой вопрос связан с массивами в C# или тем, что я считаю массивом. Я хорошо разбираюсь в основах C#, но не так много после этого.Доступ к элементам объекта в массиве

Мне было поручено внести изменения в часть кода ниже. Код извлекает список записей из веб-службы и сохраняет их в том, что я могу ошибочно считать массивом. Я не уверен, что в массивах могут быть ключи или «столбцы», как показано ниже (PurchaseDate, Location и т. Д.). Если не массив, что это такое?

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. Я хочу, чтобы иметь возможность распечатывать все ключевые имена (PurchaseDate) вместе со своими значениями (01/04/2014 и т. Д.), Используя цикл for, например. Я знаю, что это возможно в javascript. Я несколько раз пробовал, но мне не повезло. Любые предложения очень ценятся.

+0

Да, это массив, 'Продажа []' и которые являются собственностью класса 'Продажа'. Вы можете получить имена через отражение, но зачем вам это вообще нужно? Вы знаете все свойства, просто используйте [Intellisense Visual Studio] (http://msdn.microsoft.com/en-us/library/vstudio/hcw1s69b.aspx). –

+0

[] означает, что это массив – kidshaw

ответ

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# - это отражение. –

+1

@TimSchmelter Возможно, он скрыт в этом предложении 'Я знаю, что это возможно в javascript' – EZI

+0

Вы также можете сделать' Console.WriteLine ("{0} = {1}", p.Name, p.GetValue (продажа, null)); ', чтобы избежать конкатенации строк, которые могут быть медленными. Этот метод преобразуется в 'Console.WriteLine (String.Format (" {0} = {1}, p.Name, p.GetValue (sale, null)); '. [MSDN on String.Format] (http: // msdn.microsoft.com/en-us/library/system.string.format(v=vs.110).aspx) – Spans

0

Вы можете использовать правую кнопку мыши на Sale и в меню выберите "Go To Definition. Это даст вам все свойства. Если Sale является динамическим (например, может иметь более или менее свойства в более позднее время), вы можете использовать отражение (как сказал Тим). Это может быть сделано следующим образом:

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

+0

Я думаю, что это слишком обобщенный http: //stackoverflow.com/questions/2634858/how-do-i-reflect-over-the-members-of-dynamic-object –

Смежные вопросы