如何获取类型的所有非静态成员? [英] How can get all non-static members of a type?

查看:78
本文介绍了如何获取类型的所有非静态成员?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

__ traits(allMembers,T)返回实例成员和静态成员。如何过滤出静态成员?我希望这对字段和方法都适用。

__traits(allMembers, T) returns both instance and static members. How can I filter out the static members? I'd like this to work for both fields and methods.

推荐答案

当然可以。 D的自省能力是巨大的,在您的情况下过滤器来自 std .meta 是您的朋友;-)

Sure you can do this. D's introspection power is immense, in your case Filter from std.meta is your friend ;-)

struct Lion
{
    static maxSpeed = 100;
    string name;
    bool isDangerous()
    {
        return true;
    }
    static bool isAlive(uint meat)
    {
        return meat > 100;
    }
}

template FilterMembers(alias T, bool filterStatic = true)
{
    import std.meta : Filter;
    template filter(string member)
    {
        enum memberStr = T.stringof ~ "." ~ member;
        enum isStatic = __traits(isStaticFunction, mixin(memberStr)) ||
                        __traits(compiles, mixin("{auto b = " ~ memberStr ~ ";}"));
        enum filter = filterStatic ^ isStatic;
    }
    enum FilterMembers = Filter!(filter, __traits(allMembers, T));
}


unittest
{
    import std.meta : AliasSeq;
    assert(FilterMembers!Lion == AliasSeq!("name", "isDangerous"));
    assert(FilterMembers!(Lion, false) == AliasSeq!("maxSpeed", "isAlive"));
}

// or using the old-school main
version(unittest) {} else
void main()
{
    import std.stdio;
    foreach (member; FilterMembers!Lion)
        writeln(member);
}

这篇关于如何获取类型的所有非静态成员?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆