On Thursday, 15 September 2016 at 15:56:56 UTC, Gary Willoughby wrote:
On Thursday, 15 September 2016 at 15:07:09 UTC, Ram_B wrote:
How i can get fields of derived classes in runtime? This not works

What about something like this:

import std.traits;
import std.stdio;

class A {
        int a,b;
        this(){}
        void fields(this T)(){
        writeln(FieldNameTuple!(T));
        foreach(Class; TransitiveBaseTypeTuple!(T)) {
            writeln(FieldNameTuple!(Class));
        }
        }
}

class B : A{
        int c;
        this(){}
}

class C : B{
        int d;
        this(){}
}
void main(){
        C c = new C();
        c.fields();
}

This works, but i can't use (get|has)Member
class A{
        int a, b;
    Array!string fields(this T)(){
        Array!string list;
        foreach(field; FieldNameTuple!(T)){
            list.insertBack(field);
        }
        foreach(Class; TransitiveBaseTypeTuple!(T)){
            foreach(field; FieldNameTuple!(Class)){
                list.insertBack(field);
            }
        }
        return list;
    }
        void t(this T)(){
                foreach(f; this.fields()){
                        log(__traits(hasMember, T, f));         
                }
        }
}

class B : A{
        int c;
        this(){}
}

void main(){
        B b = new B();
        b.t();
}

test.d(33): Error: variable f cannot be read at compile time
test.d(33): Error: string expected as second argument of __traits hasMember instead of __error test.d(46): Error: template instance test.A.t!(B) error instantiating

Reply via email to