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