2016-03-24 2 views
2

Я пытаюсь ссылаться на имя переменной в виде строки. У меня есть список глобальных переменныхСсылки Переменные имена как строки

Public gvHeight As String = Blank 
Public gvWeight As String = Blank 
Public gvAge As String = Blank 

Мне нужно указать имя переменных для внешнего вызова API. Я пытаюсь избежать определенного кода для переменной, вместо этого позвольте мне добавить новую переменную и все ссылки правильно. У меня уже есть остальная часть кода, чтобы иметь дело с именем в виде строки.

пример:

public Height as string 
public weight as string 
public age as string 

[elsewhere in code] 
for each var as string in {public variables} 
    CallToAPI(var.name) 'needs to send "height" "weight" or "age" but there are a lot so hardcoding is not a good solution 

отредактирован, например

+2

Это не ясно, что вы имеете в виду. Можете ли вы предоставить образец псевдокода, который демонстрирует, чего вы пытаетесь достичь? – David

+1

Вы можете поместить их в словарь. Но то, что вы просите, звучит странно. –

+0

Трудно представить и API, который работает от имен, а не значений ... пахнет проблемой XY – Plutonix

ответ

0

Если все переменные одного и того же типа (здесь струнные), вы можете использовать словарь ...

Public MyModule 
    Private myVars As Dictionary(Of String, String) 

    Public Function CallToAPI(VarName As String) As String 
     If myVars.ContainsKey(VarName) Then 
      Return myVars(VarName) 
     End If 
     Return "" 
    End Function 
End Module 

И где-то еще в вашем внешнем коде

Модуль TestModule

Public Sub Test() 
    Dim myVar = MyModule.CallToAPI("test") 

End Sub 

End Module

Теперь, если ваши переменные не то же самое, то вы должны использовать Reflection ... и вот тут начинается самое интересное ...

1

Вы должны найти общественность поля через Отражение.

Имея пример DLL, составленный из этого исходного кода:

Public Class Class1 

    Public Field1 As String = "value 1" 
    Public Field2 As String = "value 2" 
    Public Field3 As Integer 

End Class 

Тогда вы могли бы сделать это:

' The library path. 
Dim libpath As String = "...\ClassLibrary1.dll" 

' The assembly. 
Dim ass As Assembly = Assembly.LoadFile(libpath) 

' The Class1 type. (full namespace is required) 
Dim t As Type = ass.GetType("ClassLibrary1.Class1", throwOnError:=True) 

' The public String fields in Class1. 
Dim strFields As FieldInfo() = 
    (From f As FieldInfo In t.GetFields(BindingFlags.Instance Or BindingFlags.Public) 
    Where f.FieldType Is GetType(String) 
    ).ToArray 

' A simple iteration over the fields to print their names. 
For Each field As FieldInfo In strFields 
    Console.WriteLine(field.Name) 
Next strField 
Смежные вопросы