可以在D中获取变量的名称吗?

时间:2013-11-28 20:17:43

标签: xml serialization d variable-names

我目前正在尝试在D中编写一个程序,当调用并传递一个对象时,它会将对象序列化为XML文档。我想让它像传递对象一样简单,但我不能完全确定它可以完成。 示例:

class A
{
    //Constructors and fluff
    ....

    int firstInt;
    int secondInt;
}

.....
A myObj = new A();
XMLSerialize(myObj);

,输出为

<A.A>
    <firstInt></firstInt>
    <secondInt></secondInt>
</A.A>

那么,我是否有可能在对象内部获取变量的名称,或者是否必须手动完成?

3 个答案:

答案 0 :(得分:6)

代码胜过千言万语(故意简化):

import std.stdio;

void print(T)(T input)
    if (is(T == class) || is(T == struct))
{
    foreach (index, member; input.tupleof)
    {
        writefln("%s = %s", __traits(identifier, T.tupleof[index]), member);
    }
}

struct A
{
    int x, y;
}

void main()
{
    print(A(10, 20));
}

答案 1 :(得分:1)

.stringof返回一个包含变量名称的字符串。

void main()
{
    int some_int;
    assert(some_int.stringof == "some_int");
}

答案 2 :(得分:1)

stingof不是合适的答案。 std.traits中有一些东西可以做更多你期望的事情。这有点像你想做的一般,但是你可以使用编译时反射为你想要的任何类生成序列化器。

https://github.com/msgpack/msgpack-d这样做。

此外:

https://github.com/Orvid/JSONSerialization/blob/master/JSONSerialization/std/serialization/xml.d