Динамически вызывать свойства по имени строки с помощью VB.NET
В настоящее время я работаю над проектом, где часть кода выглядит так:
Select Case oReader.Name
Case "NameExample1"
Me.Elements.NameExample1.Value = oReader.ReadString
....
Case "NameExampleN"
Me.Elements.NameExampleN.Value = oReader.ReadString
....
End Select
Это продолжается некоторое время. Код явно многословный, и кажется, что он может быть улучшен. Есть ли способ динамически вызывать свойство в VB.NET, чтобы можно было сделать что-то подобное:
Dim sReadString As String = oReader.ReadString
Me.Elements.InvokeProperty(sReadString).Value = sReadString
Ответы
Ответ 1
Другие ответили вполне разумно, но на всякий случай это часть кода, чувствительная к производительности, вы можете захотеть скомпоновать рефлексивные вызовы делегатам.
У меня есть запись о том, что вы поворачиваете MethodBase.Invoke в делегатах. Код находится в С#, но тот же метод может быть применен и к VB.NET. Чтобы использовать это со свойствами, получите соответствующий метод "setter" с PropertyInfo.GetSetMethod, а затем создайте делегат, который вызывает это. У вас может быть карта с именем поля, чтобы "делегировать вызов для установки поля" .
Чтобы повторить это, это действительно необходимо, если это в критическом для производительности фрагменте кода. В противном случае вы все равно можете создать Dictionary<string, PropertyInfo>
, чтобы избежать вызова GetProperty
много раз, но шаг для его преобразования в делегат, вероятно, не стоит беспокоиться.
Ответ 2
Я не могу поверить, что другие плакаты сказали вам использовать рефлексию. VB как функция CallByName, которая делает именно то, что вы хотите.
Ответ 3
Да, CallByName - лучшее решение для вас. Здесь инструкция для этого:
CallByName(yourClassOrObjectName,"NameExample1",CallType.Set,oReader.ReadString)
Вы можете написать "NameExample" вместо "NameExample1".
Упомяните, что третий параметр позволяет вам "Get", "Let" этот параметр (и даже вызывать любой метод).
Таким образом, вы можете получить значение параметра с помощью CallType.Get
.
Ответ 4
Да... CallByName
Ответ 5
Вы ищете отражение
http://www.vbdotnetheaven.com/UploadFile/rahul4_saxena/Reflection09122007031247AM/Reflection.aspx