Types 是否可以检索类.tupleof()项的名称?

Types 是否可以检索类.tupleof()项的名称?,types,tuples,d,Types,Tuples,D,当循环输入AnObject.tupleof的结果时,我可以以字符串的形式获取大小或值,但我可以通过元组项(编辑)获得更高级的信息,尤其是原始数据名(如在源类中写入的)?背景想法是将此属性用作一种RTTI。.tupleof返回值tuple,这不足以获取字段名。此外,也没有“数据名”这样的东西,因为D在数据(=值)和字段名之间没有任何关系,所以它只以其他方式存在 不过,一些内在特征可能会有所帮助: module test; class Experiment { class Nested

当循环输入AnObject.tupleof的结果时,我可以以字符串的形式获取大小或值,但我可以通过元组项(编辑)获得更高级的信息,尤其是原始数据名(如在源类中写入的)?背景想法是将此属性用作一种RTTI。

.tupleof
返回值tuple,这不足以获取字段名。此外,也没有“数据名”这样的东西,因为D在数据(=值)和字段名之间没有任何关系,所以它只以其他方式存在

不过,一些内在特征可能会有所帮助:

module test;

class Experiment
{
    class Nested
    {
    }

    Nested nested;
    int plain;
    void delegate() skipped;
}

import std.traits : isCallable, fullyQualifiedName;
import std.typetuple : Filter;

template allFields(alias T)
{
    private template combinedFilter(string name)
    {
        // filter out nested type definitions and methods
        // side effect: will filter out delegate/function pointer fields, don't know if listing those makes sense
        mixin("alias field = " ~ fullyQualifiedName!T ~ "." ~ name ~ ";"); 
        enum combinedFilter = !is(field) && !isCallable!field;
    }

    alias allFields = Filter!(combinedFilter, __traits(allMembers, T));
}

void main()
{   
    pragma(msg, allFields!Experiment);
}
你可以用这个在飞行中试验这个代码

也许有一个更简单的解决方案,但考虑到您的问题措辞,最通用的方法和D静态内省能力的小样本可能会更好地使用


希望我这次正确理解了这个问题。

您需要什么样的信息?您可以使用std.traits.FieldTypeTuple模板创建一个静态数组,您可以使用foreach循环该数组。我需要原始数据名您所说的“原始数据名”是指实际的变量/对象名吗?你想在OT的情况下获得“AnObject”字符串吗?是的,我的意思是原始名称就像prop.stringof。。。但实际上,我已经采用了另一种策略来解决遇到的编程问题,所以没关系。我的问题中有一个错误,遇到的问题也是关于检索每个元素的名称,正如在实验类中所写的,所以是一个和NestedBase。否则你的答案就有效了。元素字符串返回元素。。。