В настоящее время я работаю над проектом, в котором часть кода выглядит так:
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





Другие ответили совершенно разумно, но на всякий случай, если это чувствительный к производительности фрагмент кода, вы можете скомпилировать рефлексивные вызовы в делегатов.
У меня есть запись в блоге о превращении MethodBase.Invoke в делегатов. Код написан на C#, но тот же метод можно применить и к VB.NET. Чтобы использовать это со свойствами, получите соответствующий метод «установщика» с помощью PropertyInfo.GetSetMethod, а затем создайте делегат, который его вызывает. У вас может быть карта от имени поля до «делегата для вызова для установки поля».
Повторюсь, это действительно необходимо, только если это критичный для производительности фрагмент кода. В противном случае вы все равно можете захотеть создать Dictionary<string, PropertyInfo>, чтобы избежать многократного вызова GetProperty, но шаг по преобразованию его в делегата, вероятно, не стоит беспокоиться.
Я считаю, что CallByName использует Reflection внутри, и подозреваю, что для обратной совместимости применяет различные специфические для VB махинации. Протестируйте его, но я очень сомневаюсь, что вы увидите, что он работает так же быстро, как делегат. Да, использовать MakeDelegate сложнее, но гораздо эффективнее, чем отражение.
ссылка на запись в вашем блоге не работает
Не могу поверить, что другие плакаты говорили вам использовать отражение. VB как функция CallByName, которая делает именно то, что вы хотите.
Черт возьми, если бы я знал об этом много лет назад.
Это отличный быстрый и грязный метод для простых / небольших случаев использования. Я бы не стал использовать это для чего-то сложного или там, где у вас много «работы», если только производительность не является проблемой.
Если производительность вызывает беспокойство, вы должны использовать генерацию кода времени выполнения вместо отражения.
Да, CallByName - лучшее решение для вас. Вот инструкция, как это сделать:
CallByName(yourClassOrObjectName,"NameExample1",CallType.Set,oReader.ReadString)
Вместо NameExample1 можно написать NameExample .
.
Обратите внимание, этот третий параметр позволяет вам «получить», «разрешить» этот параметр (и даже вызвать любой метод).
Таким образом, вы можете получить значение вашего параметра с помощью CallType.Get.
CallByName выглядит проще. Чем это отличается от Reflection с точки зрения производительности?