2016-01-22 3 views
0

Id нравится знать, есть ли другой способ установить/получить значение свойства наблюдаемого свойства. Пожалуйста, смотрите ниже примераДругой способ получить/установить свойство Visual Basic ObservableCollection

Пусть говорю, что я

Public Class Record 
    public Property Field1 as string 
    public Property Field2 as string 
End Class 

Public RecordCollection as new ObservableCollection(Of Record) 
Public sRecord as Record 

Public Sub TestRecord() 
    sRecord = new Record 
    sRecord.Field1 = "test" 
    sRecord.Field2 = "test2" 
    RecordCollection.add(sRecord) 

    listview1.ItemsSource = RecordCollection 

End Sub 

Мой вопрос, как я могу установить или получающее свойство записи, как показано ниже, например?

Public Sub TestRecord() 
    sRecord = new Record 
    sRecord("Field1") = "test" 
    sRecord("Field2") = "test2" 
End Sub 

или есть ли другие способы этого?

+0

Пожалуйста, сообщите нам цель этого подхода. Вы можете использовать 'System.Reflection' для доступа к свойствам по именам. – Fabio

+0

вы можете использовать словарь для хранения значений field1, field2 и т. Д. https://msdn.microsoft.com/en-us/library/xfhwa508%28v=vs.110%29.aspx?cs-save-lang= 1 & cs-lang = vb # code-snippet-3 – 5uperdan

+0

Привет @ 5uperdan, Вы имеете в виду изменение Record Class на это? Открытый класс Запись публичной собственность Field1 как новый словарь (Of String, String) публичная собственность Field2 как новый словарь (Of String, String) End класс – bob

ответ

1

Вот пример использования System.Reflection для Вашего случая

Тестирование класса

Public Class Record 
    Public Property Field1 As String 
    Public Property Field2 As String 
End Class 

Пример

Dim data As New DataTable() 
data.Columns.Add("Field1", GetType(String)) 
data.Columns.Add("Field2", GetType(String)) 

Dim dr As DataRow 
dr = data.NewRow() 
dr.SetField("Field1", "0") 
dr.SetField("Field2", "Zero") 
data.Rows.Add(dr) 

dr = data.NewRow() 
dr.SetField("Field1", "1") 
dr.SetField("Field2", "One") 
data.Rows.Add(dr) 

For Each row As DataRow In data.Rows 
    Dim temp As New Record() 
    For Each prop As PropertyInfo In GetType(Record).GetProperties() 
     If data.Columns.Contains(prop.Name) = True Then 
      prop.SetValue(temp, row(prop.Name)) 
     End If 
    Next 
    Console.WriteLine($"{temp.Field1}, {temp.Field2}") 
Next 

Напечатает результат в консоли:

0, Zero 
1, One 

Но еще раз рассмотрим использование Entity Framework или какой-либо другой структуры ORM (объектно-реляционного картографа).

+0

Спасибо, что я сейчас просматриваю EF6 – bob

1

Вы можете использовать Default Property функциональность в классе записи:

Public Class Record 
     Private fields As New Dictionary(Of String, String) 
     Public Property Field1 As String 
      Get 
       Return fields("Field1") 
      End Get 
      Set(value As String) 
       fields("Field1") = value 
      End Set 
     End Property 


     Public Property Field2 As String 
     'Same code as Field1 but with "Field2" of course 

     Default Public Property Item(field As String) 
      Get 
       Return fields(field) 
      End Get 
      Set(value) 
       fields(field) = value 
      End Set 
     End Property 
End Class 

Доступ тогда можно как:

Dim record As New Record 
    record("Field1") = "Hello Default Property!" 
    record.Field2 = "Hello Field2 !" 
    Console.WriteLine(record("Field1")) 
+0

Большое спасибо @Alex B – bob

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