2016-11-16 3 views
-2

У меня есть этот классИспользование для каждого итерировать свойства класса

Public Class TExperience 
    Public ID As Integer 
    Public CompanyName As String 
    Public Country As String 
    Public Years As Integer 
    Public Months As Integer 
    Public JobTitle As String 
    Public Function Arr() As String() 
     Return {"ID", "CompanyName", "Country", "Years", "Months", "JobTitle"} 
    End Function 
End Class 

и это, как она работает

Public Function Set() 
    Dim D As New TExperience 
    D.CompanyName = "Any Data" 
    D.Country = "Any Data" 
    D.ID = "Any Data" 
    D.JobTitle = "Any Data" 
    D.Months = "Any Data" 
End Function 

Мне нужно обменять это на «For Each .....» в класс

 D.CompanyName = "Any Data" 
     D.Country = "Any Data" 
     D.ID = "Any Data" 
     D.JobTitle = "Any Data" 
     D.Months = "Any Data" 

Как это сделать?

+1

Для каждого предназначена для итерации коллекции - здесь не требуется. – Plutonix

+0

есть ли способ сделать это здесь или иначе, чтобы делать то, что мне нужно? –

+0

Его совсем не ясно, что вы пытаетесь сделать. Чтобы «установить» всех этих членов по одному методу, я бы использовал constuctor – Plutonix

ответ

0

Да, это возможно, если ...
Примечание: вы вывесили класс с публичными полями, например, Public CompanyName As String. Хотя обычно полезно использовать свойства - Public Property CompanyName As String. Код приведен ниже для свойств класса, но вы можете заменить PropertyInfo на FieldInfo. Тем не менее, рекомендуется использовать свойства для отображения значений классов.

Если вы ищете ответ «да/нет» на вопрос, может устанавливать свойства через каждый из них?, ответ есть. Но больше вопросов о вашем вопросе должно возникнуть. Когда, почему, зачем ... и т. Д.

Например, у нас есть ситуация, когда определенные типы имеют общие свойства с другими типами, иногда даже из этих типов, и нам нужно их преобразовать. Один из способов - использовать шаблон «Decorator». Но вот то, что мы сделали, чтобы увлажнять свойства (отказ от ответственности - код был преобразован из C# через конвертер, и я добавил некоторые Tings, как «как тип», я не уверен, что это 100% правильно)

''' Everything "S" - source, "D" - destination. "T" - type 
Public Shared Function Hydrate(Of TS, TD)(source As TS, destination As TD) As TD 

    Dim sPI() As PropertyInfo = 
     source.[GetType]().GetProperties(BindingFlags.[Public] Or BindingFlags.Instance) 
    Dim dPI() As PropertyInfo = 
     destination.[GetType]().GetProperties(BindingFlags.[Public] Or BindingFlags.Instance) 

    For Each s As PropertyInfo In sPI 
     Dim d As PropertyInfo = 
      dPI.FirstOrDefault(Function(pi) pi.Name = s.Name AndAlso pi.PropertyType = s.PropertyType) 
     If d IsNot Nothing Then 
      d.SetValue(destination, s.GetValue(source, Nothing), Nothing) 
     End If 
    Next 
    Return destination 
End Function 

Так , вот так. В этом примере свойства повторяются и когда их имена и типы данных точно совпадают, они заполняются. Но кроме увлажнения подобных моделей, каково его использование? Я имею в виду, это то, что происходит внутри, когда JSON десериализуется и т. Д. Но в повседневном программировании вы не делаете ничего подобного.

+1

Имейте в виду, что этот код не будет работать над классом OP, поскольку этот класс не имеет никаких свойств. 'GetProperties' ничего не вернет в класс OP. –

+0

... также я * думаю * OP захотел повторить имена членов из этой функции 'Arr' – Plutonix

+0

@ChrisDunaway Эй, ясно ... Я отвечаю на вопрос, независимо от кода OP. Вопрос был: «... итерации свойств класса» * –

-1

То, о чем вы просите, не представляется возможным. Как вам сказали, For Each предназначен для выполнения одного и того же действия для каждого элемента в перечислимом списке. Свойства объекта не являются перечислимым списком, поэтому в этом случае For Each не применим. Способ установить несколько значений свойств так же, как и сейчас.

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

Dim D As New TExperience With 
{ 
    .CompanyName = "Any Data", 
    .Country = "Any Data", 
    .ID = "Any Data", 
    .JobTitle = "Any Data", 
    .Months = "Any Data" 
} 

Очевидно, что вы не просили, но все же улучшили то, что делаете сейчас. В качестве альтернативы, если объект требует всех этих данных, предпочтительно объявить конструктор с соответствующими параметрами, таким образом, вызов ДОЛЖЕН предоставить данные. Однако вы все равно должны установить каждое свойство отдельно внутри конструктора.

+0

Я не вижу, как это относится к чему-либо конкретному, когда нет четкого вопроса. Зачем тратить время на перефразирование комментариев выше, когда это не приносит никакой ценности, чтобы поддержать предлагаемое решение, поскольку вы четко заявили, что не то, о чем он просил. ИМО сначала попросит разъяснения ... Еще одна заметка: использование экземпляра для создания экземпляра - это хорошо, но опять же его случайный случай, и мы явно не знаем, что это такое. – Codexer

+0

@ Zaggler, я думаю, что довольно очевидно, что ОП считал, что множественные свойства должны быть списком, и им нужен способ перечислить этот список. Я думаю, что предоставление информации о том, как установить эти ценности свойств, является целесообразным. – jmcilhinney