Setting reflection metadata at run-time

BlitzMax Forums/BlitzMax Programming/Setting reflection metadata at run-time

DavidDC(Posted 2008) [#1]
I'm currently faced with a desire to extend a base type being blocked by incompatible Field metadata.

The base type uses:

List:TList {NoClone}

And the type I'd like to make an extension of the base uses

List:TList {Clone}

Is there any way of setting metadata at run-time to get around this?


DavidDC(Posted 2008) [#2]
[edit - thought I was ok - but no, still stuck :-) ]


Perturbatio(Posted 2008) [#3]
can't you override the field in the extended type?
something like:
Type TBase
	Field List:TList {NoClone}
	Function Create:TBase()
	End Function
End Type

Type TChild extends TBase
	Field List:TList {Clone}
	Function Create:TChild()
	End Function
End Type



DavidDC(Posted 2008) [#4]

Outputs:
1
2
10
20
Dog=1
Cat=1

Uh oh...


grable(Posted 2008) [#5]
How about this?
Type TTest
	Field Test:Int {NoClone}
EndType

Local f:TField = TTypeId.ForName("TTest").FindField("Test")
Print "before: " + f.MetaData()
f._meta = "Clone=1"

Local o:TTest = New TTest
Print "after: " + TTypeId.ForObject(o).FindField("Test").MetaData()



DavidDC(Posted 2008) [#6]
Thanks grable. It certainly works! It does make me uneasy though, directly setting a private field like that - but there doesn't seem to be any other way. I guess I could set it and safety check the result and throw an exception on error so at least I won't be caught unawares if/when the reflection module changes.

What does the "=1" mean? I've looked at the source,
Function ExtractMetaData$( meta$,key$ )
	'not currently safe: , or = in metadata could stuff it up
	'should use a map
	If Not key Return meta
	key=" "+key+"="
	meta=" "+meta+" "
	Local i=meta.Tolower().Find( key.Tolower() )
	If i=-1 Return
	i:+key.length
	meta=meta[i..meta.Find( " ",i )]
	If meta.StartsWith( "~q" ) meta=meta[1..meta.length-1]
	Return meta
End Function

But I've little clue as to what's going on in there.


grable(Posted 2008) [#7]
What does the "=1" mean? I've looked at the source

Its added to any attributes without a value, so when you query for it you at least get something other than Null.


DavidDC(Posted 2008) [#8]
Right - thanks again grable.