Подтвердить что ты не робот

Динамически вызывать свойства по имени строки с помощью 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
4b9b3361

Ответ 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