Thread overview
__traits, compile time member type info
Jun 16, 2011
Lloyd Dupont
Solved!
Jun 16, 2011
Lloyd Dupont
Jun 16, 2011
Lloyd Dupont
June 16, 2011
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? 

June 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)) );
}
======

June 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?