digitalmars.D.learn - how do I read a class member's value using traits?
- Marc (8/25) Dec 15 2017 then
- Jonathan M Davis (6/31) Dec 15 2017 You're trying to read a runtime value at compile time, and that's not go...
- Marc (7/32) Dec 16 2017 You're right. I changed to generate code to do it properly at
I need to give a class C, read all user-defined members of it, both name and value dynamically. for example:class C { string a; string b; string c; }thenClass c = new C(); // set c members... enum string[] members = [__traits(allMembers, C)]; foreach(string member; members) { string value = __traits(getMember, c, member); doSomething(member, value); }I get this error:Error: variable member cannot be read at compile time Error: string expected as second argument of __traits `getMember` instead of `__error`why can't member in foreach(string member; members) be read at compile time? I've also triedforeach(enum string member; members)andstatic foreach(string member; members)but it result a lot of error messages.
Dec 15 2017
On Saturday, December 16, 2017 03:34:43 Marc via Digitalmars-d-learn wrote:I need to give a class C, read all user-defined members of it, both name and value dynamically. for example:You're trying to read a runtime value at compile time, and that's not going to work. c doesn't exist until runtime, so none of its members exist until runtime. You can introspect on the type C, but the variable c is a runtime entity. - Jonathan M Davisclass C { string a; string b; string c; }thenClass c = new C(); // set c members... enum string[] members = [__traits(allMembers, C)]; foreach(string member; members) { string value = __traits(getMember, c, member); doSomething(member, value); }I get this error:Error: variable member cannot be read at compile time Error: string expected as second argument of __traits `getMember` instead of `__error`why can't member in foreach(string member; members) be read at compile time? I've also tried
Dec 15 2017
On Saturday, 16 December 2017 at 03:48:01 UTC, Jonathan M Davis wrote:On Saturday, December 16, 2017 03:34:43 Marc via Digitalmars-d-learn wrote:You're right. I changed to generate code to do it properly at runtime, something like this:I need to give a class C, read all user-defined members of it, both name and value dynamically. for example:You're trying to read a runtime value at compile time, and that's not going to work. c doesn't exist until runtime, so none of its members exist until runtime. You can introspect on the type C, but the variable c is a runtime entity. - Jonathan M Davis[...]then[...]I get this error:[...]why can't member in foreach(string member; members) be read at compile time? I've also triedenum string[] members = [__traits(derivedMembers, Field)] [0 .. $ - 1]; static foreach(enum string member; members) { doSomething(member, __traits(getMember, fields, member));} Not sure if best approach. note: I know [0 .. $ -1] is probably wrong. I'll fix it
Dec 16 2017