2013-11-28 22 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(標識符)',而不是隻需要一個符號名稱,因爲stringof都不適用於函數並且具有未指定的文本格式。 –

+0

我打算用一些美味的特質將它們加以充實,但之後我因爲感恩節晚餐而感到分心。你的回答比較好。 – eco

1

stingof不是合適的答案。 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