2012-09-24 18 views
5

Jak mogę sprawdzić, jakie właściwości ma element w skrypcie VB? Przykład:Uzyskaj właściwości elementu VB

Dim list : Set list = CreateObject("Scripting.Dictionary") 
' ... Fill List ... 
WriteListElements list 
... 

Sub WriteListElements (list) 
    Dim e, le 
    For Each e In list 
     Set le = list(e)     ' what properties does le have? 
     le.name_of_user_defined_attribut ' I want to access a property but dont know the exact name 
    Next 
End Sub 

Używam narzędzia z interfejsem API VBScript. W tym API mogę odczytać (zdefiniowane przez użytkownika) atrybuty z tego narzędzia. Ale podczas uruchamiania skryptu pojawia się błąd informujący mnie, że nie zna on nazwy tego atrybutu zdefiniowanego przez użytkownika. Ale używam go w narzędziu. Teraz chciałbym wiedzieć, które atrybuty są dostępne w powyższej tablicy, aby sprawdzić, czy zdefiniowane przez użytkownika atrybuty mają konkretną nazwę.

+0

szukasz czegoś podobnego odbicia ale dla zwykłego starego VBScript? Jeśli tak, obawiam się, że nie jest to możliwe. Może pomożemy ci znaleźć alternatywny sposób, jeśli wyjaśnisz dokładnie, dlaczego chcesz to zrobić: czy twój obiekt 'list' nigdy nie będzie mieć tego samego typu między wywołaniami metody WriteListElements(), a tym samym nie będziesz w stanie poznać jego rodzaj? – mbarthelemy

+0

Zaktualizowałem pytanie. –

+0

Jeśli masz PowerShell, możesz utworzyć instancję obiektu tam, a następnie użyć 'gm', aby uzyskać jego członków: http://stackoverflow.com/questions/668321/how-to-use-powershell-get-member- cmdlet – bytebuster

Odpowiedz

2

Naprawdę niemożliwe. Tylko bardzo podstawowe informacje o typie są dostępne w środowisku wykonawczym VBScript. Idealnie byłoby utworzyć adapter, który tłumaczy obiekty twojego narzędzia na standardowe obiekty Dictionary i iteruje klucze. Jeśli nie jest to możliwe, najlepiej jest sprawdzić nazwę typu każdego obiektu przed wywołaniem jego członków. Przykład:

<html> 
<body> 

<script type="text/vbscript"> 

    Class Human 
     Private m_name 

     Public Property Get Name 
      Name = m_name 
     End Property 

     Public Property Let Name(newName) 
      m_name = newName 
     End Property 
    End Class 

    Dim joe 
    Set joe = new Human 
    joe.Name = "Joe Coder" 

    Dim list 
    Set list = CreateObject("Scripting.Dictionary") 
    list.Add "a", 5 
    list.Add "b", joe 
    list.Add "c", "apples" 

    WriteListElements list 

    Sub WriteListElements (list) 
     Dim e 
     For Each e In list 
      If (TypeName(list.Item(e)) = "Human") Then 
       document.write("We have found a Human: " &_ 
        "<b>" & list.Item(e).Name & "</b>") 
      End If 
     Next 
    End Sub 

</script> 

</body> 
</html> 
1
Dim list : Set list = CreateObject("Scripting.Dictionary") 
' ... Fill List ... 
WriteListElements list 
... 

Sub WriteListElements (list) 
    Dim e, le  
    For Each e In list 
     Set le = e.Items     
     Response.Write le(name_of_user_defined_attribut) 
    Next 
End Sub 
0

To proste - użyć refleksji pseudo:

class Developer 

     Public reflection 
    '============================= 
    'Private properties 
     private mId 

     private mFirstName 
     private mLastName 

     private sub Class_Initialize() 
     reflection = Array("Id","FirstName","LastName") 
     end sub 

     private sub Class_Terminate() 
     end sub 

    '============================= 
    'public properties 

     public property get Id() 
      Id = mId 
     end property 

     public property let Id(val) 
      mId = val 
     end property 


     public property get FirstName() 
      FirstName = mFirstName 
     end property 

     public property let FirstName(val) 
      mFirstName = val 
     end property 

     public property get LastName() 
      LastName = mLastName 
     end property 

     public property let LastName(val) 
      mLastName = val 
     end property 

    end class 


    For each property in obj.reflection 
    document.write(property) 
    document.write(Eval ("obj." & property)) 
    Next