Setting reflection metadata at run-time
BlitzMax Forums/BlitzMax Programming/Setting reflection metadata at run-time
| ||
| 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? |
| ||
| [edit - thought I was ok - but no, still stuck :-) ] |
| ||
| 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
|
| ||
| Outputs: 1 2 10 20 Dog=1 Cat=1 Uh oh... |
| ||
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()
|
| ||
| 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. |
| ||
| 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. |
| ||
| Right - thanks again grable. |