Перебирать значения свойств объекта?

Я знаю, что есть куча тем с одним и тем же вопросом, но я просто в замешательстве.

Я хочу перебирать свойства моих объектов и записывать значение.

Но все, что я видел, говорит

        Dim pinfo() As PropertyInfo = MyCompanies(1).GetType().GetProperties()

Это создает массив с информацией о свойствах, но не сохраняет фактическое значение этого свойства object.property,

введите здесь описание изображения

Имя свойства — тикер, но значение Mycompanies(1).ticker — AMZN.

Мой код:

 Dim pinfo() As PropertyInfo = MyCompanies(1).GetType().GetProperties()

 'Loop through Properties 
 For pi = 0 To pinfo.Length - 1
        'I want to get the values of each property
        Console.WriteLine(?)
    Next pi

Примечание. MyCompanies(1) — это всего лишь второй объект в массиве объектов, все объекты относятся к классу компаний.

https://msdn.microsoft.com/en-us/library/b05d59ty(v=vs.110).aspx тоже не помогает. Это заставляет меня поверить, что я должен сделать:

    For Each pi In pinfo
        'I want to get the values of each property
        Console.WriteLine(PropertyInfo.GetValue(MyCompanies(1))
    Next pi

но это даже не построить. Это потому, что я пытаюсь передать ему объект, используя позицию в массиве?

... и вне этого цикла мне придется перебирать массив объектов, поэтому я решил, что могу просто заменить 1 на i...


person ThomasRones    schedule 30.12.2017    source источник
comment
Класс PropertyInfo имеет множество свойств и методов (например, какой это тип данных, доступен ли он только для чтения и т. д.). По мере повторения (цикла) вам нужно будет углубиться в него, чтобы получить то, что вы хотите.   -  person Ňɏssa Pøngjǣrdenlarp    schedule 30.12.2017


Ответы (1)


Вы должны звонить так:

Dim props As PropertyInfo() = MyCompanies(1).GetType().GetProperties()

Примечание GetProperties возвращает массив PropertyInfo — по одному для каждого свойства.

Затем, чтобы зациклить:

For Each prop in props
    Console.WriteLine(prop.GetValue(MyCompanies(1)).ToString())
Next

Обратите внимание, что класс PropertyInfo не содержит ссылки на конкретный объект, из которого вы получили информацию о типе (именно поэтому вы не можете просто вызвать prop.GetValue()).

Это просто своего рода шаблон, который описывает рассматриваемый тип, и поэтому вы должны передать ему ссылку на фактический объект, значение свойства которого вы хотите извлечь.

Если бы вы обращались к нескольким объектам MyCompanies, вы бы получили информацию о типе только один раз, а затем использовали бы ее повторно.

Например:

Dim props As PropertyInfo() = MyCompanies(1).GetType().GetProperties()

For Each company in MyCompanies

    Console.WriteLine(company.ToString()) 'e.g. to print the company name

    For Each prop in props
        Console.WriteLine(prop.GetValue(company).ToString())
    Next
Next

Я не проверял код, так что извините за небольшие оплошности.

person Steve    schedule 30.12.2017
comment
почему круглые скобки идут после свойства, а не реквизита? Каждый раз, когда я объявляю массив, я пишу тусклый массив (длина) как тип - person ThomasRones; 30.12.2017
comment
Это просто мое предпочтение в данном случае, потому что я рассматриваю массив как своего рода тип. Если вы инициализируете массив фиксированной длины, я считаю, что кошерным методом объявления является Dim array As Integer() = New Integer(2) {}. Но есть пережитки синтаксиса из VB6, где вам нужно было просто сказать Dim array(2) As Integer - имея в виду, что Basic (который предшествует C++) был модифицирован объектно-ориентированными принципами, а его синтаксис массива предшествовал этой модернизации. - person Steve; 30.12.2017