2010-11-16 2 views
4

У меня есть функция, которая обновляет клиент в базе данных. Клиентский объект передается вместе со строковым массивом полей/свойств, которые необходимо обновить. Мне нужен способ доступа к каждому свойству в объекте клиента, основываясь на том, что находится в массиве. В принципе, я ищу для VB .NET, эквивалентном этому JavaScript:VB .NET Доступ к свойству класса по строковому значению

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

Любая помощь будет принята с благодарностью! Спасибо Stack.

ответ

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

Спасибо за отличный пример. По-видимому, отражение действительно дорого. Это правда? Если это так (и другого способа сделать это нет), я могу написать собственные веб-службы для каждой формы. Благодаря! – Brett

+0

Отражение может быть дорогостоящим при злоупотреблении. Я не знаю достаточно о ваших проектах, чтобы сказать, приемлемы ли накладные расходы Reflection, но есть шаги, которые вы можете предпринять (например, кэширование объектов PropertyInfo, которые вы просматриваете в словаре (Of String, PropertyInfo) ' для более быстрого извлечения), что может уменьшить накладные расходы. Я бы сказал, попробуй и посмотри, достаточно ли это. Если вы считаете, что скорость неприемлема, перейдите по пути оптимизации/кэширования или пользовательских веб-сервисов. –

+0

Приветствия! Спасибо друг. – Brett

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