2010-11-16 39 views
4

我有一個函數可以更新數據庫中的客戶端。傳入一個客戶端對象,以及應該更新的字段/屬性的字符串數組。我需要一種方法來訪問客戶端對象中的每個屬性,這取決於數組中的內容。基本上,我正在尋找VB.NET相當於這個javascript:VB .NET按字符串值訪問類屬性

var fields = ["Firstname","Lastname","DOB"]; 
for(field in fields) 
{ 
    var thisField = fields[field]; 
    client[thisField] = obj[thisField]; 
} 

任何幫助將不勝感激!感謝堆棧。

回答

5

您可以使用Reflection來做到這一點。在不瞭解數據對象如何設置的情況下,我不能給你一個完美的例子,但這裏的一般思路是:

Dim myPerson As New Person 
myPerson.FirstName = "John" 
myPerson.LastName = "Doe" 
myPerson.DOB  = #1/1/2000# 

Dim myUpdates As New Dictionary(Of String, Object) 
myUpdates.Add("FirstName", "Adam") 
myUpdates.Add("LastName" , "Maras") 
myUpdates.Add("DOB"  , #1/1/1990#) 

Dim personType As Type = GetType(Person) 

For Each kvp As KeyValuePair(Of String, Object) In myUpdates 
    Dim propInfo As PropertyInfo = personType.GetProperty(kvp.Key) 

    If propInfo IsNot Nothing Then 
     propInfo.SetValue(myPerson, kvp.Value) 
    End If 
Next 
+0

感謝您的好例子。顯然反射是非常昂貴的。這是真的?如果是這樣(並且沒有其他方法這樣做),我可能會爲每個表單編寫自定義Web服務。謝謝! – Brett 2010-11-16 04:37:13

+0

濫用時反射會很昂貴。我不太瞭解您的項目是否可以接受Reflection的開銷,但是您可以採取的步驟(如緩存您在「Dictionary(Of String,PropertyInfo)」中查找的'PropertyInfo'對象'爲更快的檢索)可以減少這種開銷。我會說,嘗試一下,看看它是否足夠快。如果您發現速度不可接受,請轉到優化/緩存路徑或您的自定義Web服務。 – 2010-11-16 04:40:58

+0

乾杯!謝了哥們。 – Brett 2010-11-16 04:42:04