2013-11-28 4 views
2

В настоящее время я пытаюсь написать программу в D, которая при вызове и передаче объекта будет сериализовать объект в документе XML. Я хотел бы сделать это так же просто, как передать объект в него, но я не совсем уверен, что это можно сделать. Пример:Возможно ли получить имя переменной в D?

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

    int firstInt; 
    int secondInt; 
} 

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

и выход будет

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

Таким образом, это возможно для меня, чтобы получить даже имя переменных внутри объекта или же, что придется все делать вручную ?

+0

вы хотите имена полей на самом деле не переменные –

+0

я предполагаю, что он нуждается в обоих, если он хочет работа над собственной схемой сериализации ... – DejanLekic

ответ

5

код стоит тысячи слов (намеренно упрощены):

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

.stringof возвращает строку с именем переменной.

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

Я рекомендую использовать '__traits (identifier)' вместо этого, когда требуется просто имя символа, поскольку stringof как не работает для функций, так и имеет неопределенный текстовый формат. –

+0

Я собирался отрастить это с некоторыми восхитительными чертами, но потом меня отвлекло, завернув мой обед с благодарением. Ваш ответ лучше. – eco

1

Жала не является подходящим ответом. В std.traits есть некоторые вещи, которые делают больше того, чего вы ожидаете. Это несколько сделать то, что вы хотите в целом, но вы можете использовать отражения времени компиляции для генерации сериализаторов для любого класса, который вы хотите.

https://github.com/msgpack/msgpack-d Это.

также:

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

+0

Этот ответ был отмечен как низкокачественный из-за его длины и содержания. Возможно, вы можете немного его использовать, чтобы сделать его более релевантным для OP и других. – paqogomez

+0

@paqogomez Это что-то вроде автоматизированного действия? Этот ответ кажется одобренным. Определенно, некачественный, просто не самый полезный ответ. – eco

+0

@eco Было отмечено, и я просмотрел флаг. Я думал, что это тоже хорошо, но кто-то не сделал этого. Просто пытаюсь помочь новым пользователям. – paqogomez