Динамически вызывать свойства по строковому имени, используя VB.NET - PullRequest
26 голосов
/ 27 октября 2008

В настоящее время я работаю над проектом, где фрагмент кода выглядит следующим образом:

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

Ответы [ 3 ]

31 голосов
/ 30 октября 2008

Я не могу поверить, что другие постеры говорили вам использовать отражение. VB как CallByName функция, которая делает именно то, что вы хотите.

16 голосов
/ 27 октября 2008

Другие ответили вполне разумно, но на случай, если это чувствительный к производительности фрагмент кода, вы можете скомпилировать отражающие вызовы в делегаты.

У меня есть запись в блоге о превращении MethodBase.Invoke в делегатов. Код написан на C #, но тот же метод может быть применен и к VB.NET. Чтобы использовать это со свойствами, получите соответствующий метод "setter" с PropertyInfo.GetSetMethod и затем создайте делегат, который вызывает это. Вы можете получить карту от имени поля до «делегировать вызов для установки поля».

Просто повторюсь, это действительно необходимо, только если это часть кода, критичного к производительности. В противном случае вы все равно можете создать Dictionary<string, PropertyInfo>, чтобы избежать многократного вызова GetProperty, но, вероятно, не стоит беспокоиться о шаге преобразования его в делегат.

11 голосов
/ 24 марта 2013

Да, CallByName - лучшее решение для вас. Вот инструкция, как это сделать:

CallByName(yourClassOrObjectName,"NameExample1",CallType.Set,oReader.ReadString)

Вы можете написать «NameExample» вместо «NameExample1».
Отметим, что третий параметр позволяет вам «получить», «разрешить» этот параметр (и даже вызвать любой метод).
Таким образом, вы можете получить значение вашего параметра, используя CallType.Get.

...