reflection, getting Type instance name

BlitzMax Forums/BlitzMax Programming/reflection, getting Type instance name

TomToad(Posted 2016) [#1]
I have a type, I create an instance of the type with New. I want to get the name of the instance, but the TypeID.Name() method returns the type name, not the instance name.
Type TMyType
	Field x:Float, y:Float
End Type

Local Dot:TMyType = New TMyType

Local ID:TTypeId = TTypeId.ForObject(Dot)

Print ID.Name() 'Prints "TMyType", but I want it to print "Dot"



Derron(Posted 2016) [#2]
There is no reason for Objects to have "names".

Imagine instead of "Dot:TMyType" you have list containing various TMyType-Instances. They would not have a name - would they?

local dots:TList = CreateList
dots.AddLast( new TMyType)


So you'd better add a GUID/ID-system to your TMyType and then you could identify it by an manually or semi-automatically assigned name.

Type TMyType
  field ID:int = -1
  global lastID:int = 0

  Method New()
    lastID :+ 1
    ID = lastID
  End Method

  Method Init:TMyType(GUID:string)
    if GUID = "" then GUID = self.ID
    self.GUID = GUID
    return self
  End Method

... 
dots.AddLast( new TMyType.Init("dot") )

(above does not take care of clashes by manually assigning already used IDs as GUID)


bye
Ron


TomToad(Posted 2016) [#3]
What I am doing is trying to create an error logging routine for the methods in my type. I want to print out which object is generating the error. The sample below is basically what I'm doing now, passing a Name to the Create function, but I want to default to the object name when no name is passed.



TomToad(Posted 2016) [#4]
Thinking a bit more about it, I see what you are saying. The variable is only a placeholder for the object reference. Since the reference can be moved around (from variable to list, from list to another variable, etc...) there is no way to attach a name to it without explicitly giving it one (like my example above).

Local Dot1:TPoint = TPoint.Create(10,10) 'Object created
local Dot2:TPoint = Dot1 'Same Object, different variable holding the reference


Derron(Posted 2016) [#5]
Yes ... exactly.


Instead of "reflection" you also could default a name to be something hand-written (in your case the class name ... name:string="TMyType"). When extending objects you use custom "Method New()"-methods which override the default name by doing a (name = "TMyExtendedType").

This way you could avoid the depths of the reflection code (might save some cpu cycles in tight loops).


bye
Ron