On Tue, Aug 06, 2013 at 11:41:35PM +0200, Gary Willoughby wrote: > Is it possible using reflection or similar to extract only public > method names from classes? I'm thinking how i would go about writing > a unit test/mocking framework, investigating how i can gather > information about such things before i manipulate them.
The following code demonstrates how you can do this: import std.stdio; class Base { private int x; public int y; this() {} private void privMethod() {} public void method() {} } class Derived : Base { public override void method() {} public void derivedMethod() {} private void privDerivedMethod() {} } void showAllMethods(C)(C obj) { writeln("All members:"); foreach (field; __traits(allMembers, C)) { static if (is(typeof(__traits(getMember, obj, field)) T == function)) { auto prot = __traits(getProtection, __traits(getMember, obj, field)); writefln("\t(%s) %s", prot, field); } } } void showDerivedMethods(C)(C obj) { writeln("\nDerived members:"); foreach (field; __traits(derivedMembers, C)) { static if (is(typeof(__traits(getMember, obj, field)) T == function)) { auto prot = __traits(getProtection, __traits(getMember, obj, field)); writefln("\t(%s) %s", prot, field); } } } string[] getPublicMethods(C)(C obj) { string[] methods; foreach (field; __traits(allMembers, C)) { static if (is(typeof(__traits(getMember, obj, field)) == function) && __traits(getProtection, __traits(getMember, obj, field)) == "public") { methods ~= field; } } return methods; } void main() { auto d = new Derived(); showAllMethods(d); showDerivedMethods(d); writeln("All public methods:"); writeln(getPublicMethods(d)); } The output is: All members: (public) method (public) derivedMethod (private) privDerivedMethod (public) __ctor (private) privMethod (public) toString (public) toHash (public) opCmp (public) opEquals (public) factory Derived members: (public) method (public) derivedMethod (private) privDerivedMethod (public) __ctor All public methods: ["method", "derivedMethod", "__ctor", "toString", "toHash", "opCmp", "opEquals", "factory"] Hope this helps! T -- Designer clothes: how to cover less by paying more.