On Friday, 1 September 2017 at 20:27:45 UTC, Jonathan Marler
wrote:
You would also need to know type information, not just the name
itself. If you had a name like mine.A.B.Test, then you would
need to know what A, B, and Test are, are they modules,
classes, structs, enums, etc
Actually found a way around this.
When `reflectFqn` below is instantiated, the fully qualified name
that was provided as the template arg gets baked into the
function name in hex. So all I have to do is figure out how to
get the mangle of reflectFqn!("some string") at runtime.
`
abstract class Reflection {
string name() const;
}
class ReflectionImpl(T) : Reflection {
override string name() const {
return T.stringof;
}
}
export extern(C) const(Reflection) reflectFqn(string fqn)()
{
mixin("alias T = " ~ fqn ~ ";");
static const(Reflection) refl = new ReflectionImpl!T;
return refl;
}
const(Reflection) reflect(T)() {
return (reflectFqn!(fullyQualifiedName!(Unqual!T)));
}
int main(string[] argv)
{
alias TFunc = const(Reflection) function();
string mangle = reflectFqn!"package.module.Test".mangleof;
auto handle = GetModuleHandleA(null);
auto getRefl= cast(TFunc)GetProcAddress(handle,
mangle.toStringz);
writeln(getRefl().name);
return 0;
}
`