digitalmars.D.learn - smarter reflection issue
- Lloyd Dupont (33/33) Jun 16 2011 I have a MemberDesc class which describe a class's members.
- Jesse Phillips (5/48) Jun 16 2011 MemberDesc MEMBER(T, string memberName)() if(std.traits.hasMember!(T, me...
- Lloyd Dupont (20/54) Jun 16 2011 Hi Jesse, this won't work!
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); } =====
Jun 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); } =====
Jun 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); } =====
Jun 16 2011