How to get C# instance from a node, without knowing its C# type?

:information_source: Attention Topic was automatically imported from the old Question2Answer platform.
:bust_in_silhouette: Asked By Karatoga

I’m trying to find out all nodes that belongs to some specific types:

void CheckRecursive(Node node)
{
    var type = node.GetType();
    if(typesToBeUpdated.TryGetValue(type, out var method))
    {
        method.Invoke(node, null);
    }
    foreach(var c in node.GetChildren()) CheckRecursive(c);
}

However node.GetType() doesn’t return correct type with my script attached to a node.
For exampleclass Tweener : Node. it always returns Node object instead of Tweener object.

How to get the Tweener script object?

Cast it var type = node as Tweener. You can use pattern matching too, e.g.

if (node is Tweener tweener)
{
    tweener.Method();
}

spaceyjase | 2023-05-31 15:13

node is a C# object and GetType() is the common C# function that returns the corresponding Type class object, so the returnd object of GetType() will never be Tweener

Karatoga | 2023-05-31 15:22

I corrected my post; you can cast the node.

spaceyjase | 2023-05-31 15:38

well I am quite sure this kind of casting will succeed when and only when Node node variable is pointing to an instance of class Tweener. That’s the problem: it’s actually not Tweener, so casting will always fail, and GetType() doesn’t return typeof(Tweener) too…
On the other hand, typesToBeUpdated stores Type objects collected by some reflection magic. I can’t cast it using is or as keyword since I can’t directly reference their class name in code, but only their Type objects.

Karatoga | 2023-05-31 15:54

Yeah sure, that’s a tough one as GetType() will return the type as instanced; I think that unless you’re manually creating Tweener then it will always return the engine’s type.

This smells as while C# has a great type system, it’s fighting with godot so perhaps here it’s be better to refactor to leverage goody’s types? Not sure what you’re up to :wink:

I think even with code like typeof(tweener).IsAssignableFrom(node.GetType()) you’ll get unstuck and that’s just nasty as it potentially introduces types and references, as you mentioned.

spaceyjase | 2023-05-31 17:00