Introspection/Reflection/etc on Linux

Jacob Carlborg doob at me.com
Mon Oct 24 00:47:13 PDT 2011


On 2011-10-24 05:37, J Arrizza wrote:
> Robert, I tried .stringof and it didn't quite get me as far as I wanted.
>
> But the using a template got me much closer:
>
>     unittest
>        {
>        //create bob to kick off the whole thing
>        new Bob();
>        }
>
>     class Base
>        {
>          // find all the derived members and run them
>          // Base doesn't have to know anything about the derived classes
>          public void runallin(alias T) ()
>          {
>            void delegate() dg;
>
>            //create a delegate and run it
>            foreach (i, m; __traits(derivedMembers, T))
>              {
>              //skip ctor, no need to run it again.
>              if (m != "__ctor")
>                {
>                writeln("== i=", i, "  m=", m);
>                //by trial and error, I found I need to use
>                //    5 + the number of methods in class Base (exclude ctor)
>                //right now, no additional methods, so 5 it is.
>                dg.funcptr = cast(void function()) this.classinfo.vtbl[i
>     + 5];
>                dg.ptr = cast(void*) this;
>                writeln("   calling dg");
>                dg();
>                }
>              }
>          }
>        }
>
>     // the class to auto-run
>     class Bob: Base
>        {
>        this()
>          {
>          runallin!Bob;
>          }
>        public void inBob1()
>            {
>              writeln("   in bob : inBob1()");
>            }
>
>        public void inBob2()
>          {
>            writeln("   in bob : inBob2()");
>          }
>        }
>
>
> Here's the output:
>
>     == i=1  m=inBob1
>         calling dg
>         in bob : inBob1()
>     == i=2  m=inBob2
>         calling dg
>         in bob : inBob2()
>
>
> Getting closer. Next:
> - check the signature of the methods (I want to run void fn(void) only)
> - find all the classes in a given module so I don't have to "new Bob()"

You can foreach over ModuleInfo and access the classes using 
"localClasses". Have a look at the implementation of 
object.TypeInfo_Class.find in druntime.


-- 
/Jacob Carlborg


More information about the Digitalmars-d mailing list