digitalmars.D.learn - __traits, compile time member type info
- Lloyd Dupont (32/32) Jun 16 2011 I'm trying to build an introspection system for a project I have.
- Lloyd Dupont (15/15) Jun 16 2011 work with typeinfo!! :)
- Lloyd Dupont (46/46) Jun 16 2011 works with typeinfo!
I'm trying to build an introspection system for a project I have. I already have a working template to get members value === working members getter === Variant GETTER(T, string member)(Object target) { T tt = cast(T)target; if (!tt) throw new ReflectionException("target is null or not " ~T.stringof ~" value: " ~target.toString()); return Variant(__traits(getMember, tt, member)); } =========================== Now I'm trying to implement a working setter. I have a problem for testing and converts the value. Ideally I'd like something like the code below ===== not compiling setter ==== void SETTER(T, string member)(Object target, Variant value) { T tt = cast(T)target; if (!tt) throw new ReflectionException("target is null or not " ~T.stringof ~" value: " ~target.toString()); if(!value.convertsTo!( typeid(__traits(getMember, T, member))) ) throw new ReflectionException("Can't convert " ~value.stringof ~" to " ~typeid(__traits(getMember, T, member)).toString()); __traits(getMember, tt, member) = value.coerce( typeid(__traits(getMember, T, member)) ); } ========================== it doesn't compile because I don't know how to get the type, at compile time, of member "member" of type "T" how do I do that please?
Jun 16 2011
work with typeinfo!! :) ===== void SETTER(T, string member)(Object target, Variant value) { T tt = cast(T)target; if (!tt) throw new ReflectionException("target is null or not " ~T.stringof ~" value: " ~target.toString()); if(!value.convertsTo!( typeof(__traits(getMember, T, member)) )) throw new ReflectionException("Can't convert " ~value.stringof ~" to " ~typeof(__traits(getMember, T, member)).stringof); __traits(getMember, tt, member) = value.coerce!( typeof(__traits(getMember, T, member)) ); } ======
Jun 16 2011
works with typeinfo! void SETTER(T, string member)(Object target, Variant value) { T tt = cast(T)target; if (!tt) throw new ReflectionException("target is null or not " ~T.stringof ~" value: " ~target.toString()); if(!value.convertsTo!( typeof(__traits(getMember, T, member)) )) throw new ReflectionException("Can't convert " ~value.stringof ~" to " ~typeof(__traits(getMember, T, member)).stringof); __traits(getMember, tt, member) = value.coerce!( typeof(__traits(getMember, T, member)) ); } "Lloyd Dupont" wrote in message news:itcthc$1onk$1 digitalmars.com... I'm trying to build an introspection system for a project I have. I already have a working template to get members value === working members getter === Variant GETTER(T, string member)(Object target) { T tt = cast(T)target; if (!tt) throw new ReflectionException("target is null or not " ~T.stringof ~" value: " ~target.toString()); return Variant(__traits(getMember, tt, member)); } =========================== Now I'm trying to implement a working setter. I have a problem for testing and converts the value. Ideally I'd like something like the code below ===== not compiling setter ==== void SETTER(T, string member)(Object target, Variant value) { T tt = cast(T)target; if (!tt) throw new ReflectionException("target is null or not " ~T.stringof ~" value: " ~target.toString()); if(!value.convertsTo!( typeid(__traits(getMember, T, member))) ) throw new ReflectionException("Can't convert " ~value.stringof ~" to " ~typeid(__traits(getMember, T, member)).toString()); __traits(getMember, tt, member) = value.coerce( typeid(__traits(getMember, T, member)) ); } ========================== it doesn't compile because I don't know how to get the type, at compile time, of member "member" of type "T" how do I do that please?
Jun 16 2011