Proposal: user defined attributes

Jacob Carlborg doob at me.com
Wed Mar 28 06:32:02 PDT 2012


On 2012-03-28 03:41, Martin Nowak wrote:

> Just showing this because it never comes up that one can already implement
> runtime reflection using ModuleInfo.xgetMembers and
> TypeInfo_Struct.xgetMembers.
>
> module a;
> import std.stdio, std.variant;
>
> void main()
> {
> foreach(m; ModuleInfo)
> {
> if (m.name != "b") continue;
> // getMembers currently doesn't work for classes,
> // but it does for modules/structs
> auto get = cast(Variant function(string))m.xgetMembers;
> auto bfunc = get("bfunc").get!(size_t function());
> writeln(bfunc());
> }
> }
>
>
> module b;
> import std.variant;
>
> // a pointer to this method will end up in ModuleInfo xgetMembers
> Variant getMembers(string name)
> {
> Variant res;
> switch (name)
> {
> case "bfunc": return Variant(&bfunc);
> default: return Variant("member "~name~" not found");
> }
> }
>
> size_t bfunc()
> {
> return 2;
> }
>
> It should be fairly easy to construct some helpers that make the compile
> time data digestible.

I had no idea that xgetMembers work at all. But as the comment says, it 
doesn't work for classes.

-- 
/Jacob Carlborg


More information about the Digitalmars-d mailing list