2009-01-26 27 views
5

我正在尋找相當於下面代碼的東西,但是對於任何值類型,無需爲每種數據類型編碼switch語句。 下面的代碼不會編譯,因爲XmlConvert.ToString()沒有接受和對象的重載。如何將使用XmlConvert轉換爲字符串的值類型轉換爲字符串?

 int intValue = 10; 
     object boxedValue = (object)intValue; 
     string xmlValue = XmlConvert.ToString(boxedValue); 

換句話說,有沒有比這更好的辦法:

public static string ToXmlString(Type type, object value) { 

     switch(Type.GetTypeCode(type)) { 
      case TypeCode.Int32: 
       return XmlConvert.ToString((int) value); 
      case TypeCode.DateTime: 
       return XmlConvert.ToString((DateTime) value, XmlDateTimeSerializationMode.Unspecified); 
      case TypeCode.Boolean: 
       return XmlConvert.ToString((bool) value); 

      // TODO: Add case for all other value types! 

      default: 
       return value.ToString(); 
     } 
    } 

回答

0

就扔了這一點,在那裏,你在試圖將業務對象轉換爲XML?

也許你可能想看看XmlSerialization。如果你在你的業務對象上標記一些屬性,.Net會爲你做所有的花哨的XML內容:)。

另外,有沒有什麼原因你爲什麼拳擊你的價值? XmlConvert.ToString()有19個重載,其中許多是基元。

+0

我非常欣賞這張照片,但是我已經通過了XmlSerializer,DataContractSerializer地獄。我甚至和XamlWriter一起玩過。我的值被裝箱,因爲我通過處理許多數據類型的接口訪問它們。 – 2009-01-26 01:59:37

2

所有值類型都固有地可序列化。所以你只需要使用一個XMLSerializer。 像這樣的事情會做(根據你的方法):

public static string ToXmlString(Type type, object value) 
{ 
    StringBuilder sb = new StringBuilder(); 
    System.Xml.XmlWriter writer = System.Xml.XmlWriter.Create(sb); 
    System.Xml.Serialization.XmlSerializer serial = 
     new System.Xml.Serialization.XmlSerializer(type); 
    serial.Serialize(writer, value); 
} 
+0

有趣的是,如果您使用Reflector追蹤到XmlSerializer.Serialize,您最終會找到一個名爲SerializePrimitive的方法,該方法有一個大的switch語句,該語句調度到最終調用XmlConvert.ToString的方法,並將對象轉換爲本機類型。 – 2009-01-26 02:12:56

1

另一種選擇是使用反射來看看在做,然後System.Xml.Linq.XContainer.GetStringValue的副本(它的內部不幸)

1

我不得不做相反的轉換(字符串到類型)作爲我想編寫的序列化程序的一部分(避免內置於原因之一)。我正在進行反序列化,這是唯一一個討論它的帖子,所以我正在用我的答案進行更新,而它仍然是新鮮的。

我使用的方法是使用反射來基本解決我需要做的事情。下面例子中的變量類型是我正在轉換的類型的Type對象,E是一個XmlNode,其內容將被轉換,newVar是我將返回的模板類型T的一個實例。此片段不承擔對T的任何約束(這就是爲什麼沒有直接串分配/ CAST),並假設對象/枚舉的處理方式不同(對象和枚舉打破這個):

MethodInfo convertMethod; 

if(Type.GetTypeCode(type) != TypeCode.String) 
    convertMethod = typeof(XmlConvert).GetMethod ("To" + type.Name); 
else 
    convertMethod = E.InnerText.GetType().GetMethod("Clone"); 

if(convertMethod == null) 
{ 
    //Error 
} 
else 
{ 
    if(Type.GetTypeCode (type)!= TypeCode.String) 
     newVar = (T)convertMethod.Invoke(null, new object[] { E.InnerText }); 
    else 
     newVar = (T)convertMethod.Invoke (E.InnerText, new object[]{}); 
} 

(字符串需要處理作爲一種特殊情況,ToString()做了其他完全不同的事情,並且打破了一切)。

周圍的其他方法(按照原來的職位)將是這樣的(未測試,如果我寫的連載功能,將更新):

MethodInfo convertMethod; 

if(Type.GetTypeCode(type) != TypeCode.String) 
    convertMethod = typeof(XmlConvert).GetMethod ("ToString", new Type[] {typeof(T)}); 
else 
    convertMethod = typeof(string).GetMethod("Clone"); 

if(convertMethod == null) 
{ 
    //Error 
} 
else 
{ 
    string str; 
    if(Type.GetTypeCode (type)!= TypeCode.String) 
     str = (string)convertMethod.Invoke(null, new object[] { Value }); 
    else 
     str = (string)convertMethod.Invoke (Value, new object[]{}); 
} 

在這種情況下,轉換是從T到字符串而Value包含我們正在轉換的類型T.區別在於我們要求ToString,但用一個T型參數指定函數。這應該是足夠獨特的。