On Friday, 29 September 2017 at 16:40:38 UTC, Gheorghe Gabriel wrote:
On Friday, 29 September 2017 at 16:24:32 UTC, bitwise wrote:
On Friday, 29 September 2017 at 11:05:00 UTC, Gheorghe Gabriel wrote:
[...]
If i compile this script to a .dll

DLL support for D is currently very spotty. Before investing too much time, I would suggest confirming that DLLs are even properly supported for your target platform at all.

So, could you upload a copy of your own reflection module? I want to try it and then I will send you my feedback.

I'm reworking how properties/fields are set, and how functions are called. I'm not sure how long it will take. I'll throw a copy up when it's done.

Simple reflection is not that hard though:

`
ClassReflection[string] _reflections;

abstract class ClassReflection
{
    Object create() const;
    string name() const;
}

class ClassReflectionImpl(T) : ClassReflection
{
    import std.traits : fullyQualifiedName;
    static this() {
        _reflections[fullyQualifiedName!T] = new typeof(this);
    }

    override Object create() const { return new T; }
    override string name() const { return T.stringof; }
}

template registerClass(T) {
    alias registerClass = ClassReflectionImpl!T;
}

export extern(C) ClassReflection reflectionOf(string name) {
    ClassReflection* pRefl = name in _reflections;
    return pRefl ? *pRefl : null;
}

class Player {
    void speak() { writeln("hello world"); }
}

alias registration = registerClass!Player;

int main(string[] argv)
{
    ClassReflection playerRefl = reflectionOf("main.Player");
ClassReflection missingRefl = reflectionOf("main.MissingClass");
    assert(playerRefl !is null);
    assert(missingRefl is null);

    Player player = cast(Player)playerRefl.create();
    assert(player !is null);
    player.speak();

    return 0;
}
`

You can use __traits and std.traits to build whatever you need into ClassReflection.


Reply via email to