Thread overview
smarter reflection issue
Jun 16, 2011
Lloyd Dupont
Jun 16, 2011
Jesse Phillips
Jun 16, 2011
Lloyd Dupont
June 16, 2011
I have a MemberDesc class which describe a class's members.
I fill it with a template method like that (with GETTER and SETTER some other templated method I wrote)
=====
MemberDesc MEMBER(T, string memberName)()
{
   TypeInfo ti = typeid( typeof(__traits(getMember, T, memberName)) );

   Variant function(Object target) getter = null;
   getter = &GETTER!(T, memberName);


   void function(Object target, Variant value) setter = null;
   setter = &SETTER!(T, memberName);

   return new MemberDesc(memberName, ti , getter, setter);
}
=====

And it works except that I don't do any check that the setter / getter method exist!

I tried something like that
====
static if( __traits(compiles, __traits(getMember, T, member)) )
{
   getter = &GETTER!(T, memberName);
}
====

but this always fail... mm.. how could I check for the getter?


and i guess it's even harder for the setter!
how about something like that (how to fix it?)
=====
static if( __traits(compiles, __traits(getMember, T, member) = typeof(__traits(getMember, T, memberName)).init) )
{
   setter = &SETTER!(T, memberName);
}
=====

June 16, 2011
MemberDesc MEMBER(T, string memberName)() if(std.traits.hasMember!(T, memberName))
{
...
}

Lloyd Dupont Wrote:

> I have a MemberDesc class which describe a class's members.
> I fill it with a template method like that (with GETTER and SETTER some
> other templated method I wrote)
> =====
> MemberDesc MEMBER(T, string memberName)()
> {
>     TypeInfo ti = typeid( typeof(__traits(getMember, T, memberName)) );
> 
>     Variant function(Object target) getter = null;
>     getter = &GETTER!(T, memberName);
> 
> 
>     void function(Object target, Variant value) setter = null;
>     setter = &SETTER!(T, memberName);
> 
>     return new MemberDesc(memberName, ti , getter, setter);
> }
> =====
> 
> And it works except that I don't do any check that the setter / getter method exist!
> 
> I tried something like that
> ====
> static if( __traits(compiles, __traits(getMember, T, member)) )
> {
>     getter = &GETTER!(T, memberName);
> }
> ====
> 
> but this always fail... mm.. how could I check for the getter?
> 
> 
> and i guess it's even harder for the setter!
> how about something like that (how to fix it?)
> =====
> static if( __traits(compiles, __traits(getMember, T, member) =
> typeof(__traits(getMember, T, memberName)).init) )
> {
>     setter = &SETTER!(T, memberName);
> }
> =====
> 

June 16, 2011
Hi Jesse, this won't work!
It's my fault in not explaining my problem well though...

I forget to mention something...
I'm using property syntax and try to call the method

Say I have
=====
private int _foo;
@property public int Foo() { return _foo; }
@property public void Foo(int value) { _foo = value; }
=====
if I call MEMBER(MyClass, "Foo")
I'd like to do some static test for "int Foo()" and "void Foo(int)"

So... how will I go on solving that?



"Jesse Phillips"  wrote in message news:itdqs4$mv0$1@digitalmars.com...

MemberDesc MEMBER(T, string memberName)() if(std.traits.hasMember!(T, memberName))
{
...
}

Lloyd Dupont Wrote:

> I have a MemberDesc class which describe a class's members.
> I fill it with a template method like that (with GETTER and SETTER some
> other templated method I wrote)
> =====
> MemberDesc MEMBER(T, string memberName)()
> {
>     TypeInfo ti = typeid( typeof(__traits(getMember, T, memberName)) );
>
>     Variant function(Object target) getter = null;
>     getter = &GETTER!(T, memberName);
>
>
>     void function(Object target, Variant value) setter = null;
>     setter = &SETTER!(T, memberName);
>
>     return new MemberDesc(memberName, ti , getter, setter);
> }
> =====
>
> And it works except that I don't do any check that the setter / getter
> method exist!
>
> I tried something like that
> ====
> static if( __traits(compiles, __traits(getMember, T, member)) )
> {
>     getter = &GETTER!(T, memberName);
> }
> ====
>
> but this always fail... mm.. how could I check for the getter?
>
>
> and i guess it's even harder for the setter!
> how about something like that (how to fix it?)
> =====
> static if( __traits(compiles, __traits(getMember, T, member) =
> typeof(__traits(getMember, T, memberName)).init) )
> {
>     setter = &SETTER!(T, memberName);
> }
> =====
>