Reflection field - >list?

Monkey Forums/Monkey Programming/Reflection field - >list?

slenkar(Posted 2012) [#1]
when i cast a list to generic <Object> it is always NULL
but if I cast straight to List<character> it works

When I am saving or loading a game I wont know what type of data the lists contain

So, how do I deal with a list when I dont know what type it will contain?

Strict
Import reflection
Import mojo

Class trev Extends App
Method OnCreate:Int()
world_map.inst=New world_map
world_map.inst.character_list=New List<character>
Local c:character=New character
c.name="TREV"
world_map.inst.character_list.AddLast(c)
SetUpdateRate 30
Local clas:=GetClass(world_map.inst )
Print "class name "+clas.Name
	For Local info:=Eachin clas.GetFields()
			Print "  Field "+info.Name
			If info.Type<>Null
			Print "type"+ info.Type.Name
			If info.Type.Name.Find("monkey.list.List")=0
			Print "Found a List!"
			Local l:List<Object>=List<Object>(info.GetValue(world_map.inst))
			If l<>Null
			For Local o:Object=Eachin l
			Print "found something on the list
			Next
			Else
			Print "the list is null!"
			Endif
			Endif
			Endif
	Next
Return 0
End Method
Method OnRender:Int()
Return 0
End Method
Method OnUpdate:Int()
Return 0
End Method

End Class

Function Main:Int()
New trev

Return 0
End Function


Class character
Field name$
End Class
Class world_map
Global inst:world_map
Field character_list:List<character>
Field num:Int
Field float_num:Float
Field my_String:String
End Class



marksibly(Posted 2012) [#2]
Hi,

This is a limitation of the generics/reflection system.

List<Object> and List<Thing> are 2 entirely separate classes - you can't cast a List<Thing> to a List<Object>.

Also, reflection can't 'create' a generic class that didn't already exist when the program was compiled. To do so, it would need to be able to compile/build/link an entirely new List<> class on the fly.

You should be able to use reflection to traverse an unknown type of list though - ie: find the 'ObjectEnumerator' method in the List and use that.

It would probably also be nice if there was a common 'Enumerable' interface or similar...


slenkar(Posted 2012) [#3]
You should be able to use reflection to traverse an unknown type of list though - ie: find the 'ObjectEnumerator' method in the List and use that.


When you say 'you should be able to' you mean Monkey should support that.

You dont mean its already possible do you?

'Enumerable' would be very good as it might allow me to traverse a list, stack,map or set without having to write a function for each data holder?


marksibly(Posted 2012) [#4]
Hi,

Ok, got this working but it involved another fix - not all generic instantiation members were being reflected.

Will have a think about this, there's hopefully a better way to do it!