在循环AnObject.tupleof的结果时,我可以将大小或值作为字符串获取,但我是否可以通过元组项(编辑)获得更高级的信息,尤其是原始数据名称(如源类中所写)?背景想法是将此属性用作一种RTTI。
问问题
146 次
1 回答
2
.tupleof
返回值元组不足以获取字段名称。也没有“数据名称”之类的东西,因为 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);
}
您可以使用此DPaste即时试验此代码。
可能有一个更简单的解决方案,但考虑到您的问题措辞,最通用的方法和 D 静态自省能力的小样本可能会更好用。
希望这次我已经理解了这个问题。
于 2013-03-14T12:06:47.093 回答