sadly the search function didn't return the above link...
Ok, well you can make a "list", but you have to roll your own. If this is a small class, and you don't do a lot of looping etc. on that class?
Then you can "maintain + hand code" a "list" in your class, and then return that.
So, for each new memeber of the class, then you have to add that our method - lets use "items" for that method.
And like in .net, I often don't bother to write get-ers and set-ers but just expose the base variables as public.
So, a simple class like this:
---- clsPerson
Sub Class_Globals
Public FirstName As String
Public LastName As String
Private m_Map As Map
End Sub
'Initializes the object. You can add parameters to this method if needed.
Public Sub Initialize
m_Map.Initialize
End Sub
Sub FullName As String
Return FirstName & " " & LastName
End Sub
Sub Items As Map
m_Map.Put("FirstName",FirstName)
m_Map.Put("LastName",LastName)
m_Map.Put("FullName",FullName)
Return m_Map
End Sub
So in above, just remember while coding that you tie a little string around your finger, and for EACH property/method of the class, make sure you add it to the "items" method in above.
Now, in code we can do this:
Dim OnePerson As clsPerson
OnePerson.Initialize
OnePerson.FirstName = "Albert"
OnePerson.LastName = "Kallal"
For Each MyKey As String In OnePerson.Items.Keys
Log("Class item = " & MyKey & " Value of item = " & OnePerson.Items.Get(MyKey))
Next
Dim strMyProperty As String = "FullName"
Log(OnePerson.Items.Get(strMyProperty))
Note VERY interesting that LAST line of code. By adding that "map" to the class, then we can get/grab/retrive ANY member by a key value (a string value in a variable).
Output:
Class item = FirstName Value of item = Albert
Class item = LastName Value of item = Kallal
Class item = FullName Value of item = Albert Kallal
Albert Kallal
So there is no "attribute" say like in .net (or even VBA/VB6) in which you can mark each method/property the class as to be "interable" for that class.
I will note that because that I re-fill the map each time, then that "items" code is re-run for "each" for-each or any time you referernce "map". If this was to be a processing intensive loop, or performance was going to matter, then I would move the public FirstName/LastName to get/setters, and for all methods I would "maintain" the map always - and then just expose the map as public. That way you could use a for/each and not re-trigger the full re-load of the map each time.
However, given we have 1+ million instructions per second, then the above simple approach for "most" cases should suffice without performance considerations.
So, you the Mark II Human carbon based computer have to maintain and update that "items" method for each new property/method. Given that most classes we hope are not all that complex, then I find this approach is rather worth the extra coding time to maintain that "items" method.
The end result is not only do we get for/each iteration of the values (and returned as a key), we also gain the ability to get/grab ANY property by using a string variable. (as per last line of code in above).
And I also think that perhaps a "key pair" value could be exposed, and that could used for the for each
So you could have For each OneV as OneKeySet in OnePersions.items
OneV.Key, and OneV.Value could be returned.
Regardless, you can (have to) roll your own exposed list or I think "map" in this case. I think map is somewhat better here, but one can re-write above using a "list" if you wish. I would prefer a key name + value pair returned, or as per above just get/grab that value.
So, we could ouput say
Type MyKey(Key As String,Value As Object)
To a list, and then your for each would interate on above type returned as a list.
So, you have thus a few ideas here.
Regards,
Albert D. Kallal
Edmonton, Alberta Canada