2009-01-26 19 views
5

Tôi đang tìm một cái gì đó tương đương với mã bên dưới nhưng đối với bất kỳ loại giá trị nào mà không phải mã hóa câu lệnh chuyển đổi cho từng loại dữ liệu. Mã bên dưới không biên dịch vì XmlConvert.ToString() không có quá tải chấp nhận và đối tượng.Làm cách nào để chuyển đổi một loại giá trị được truyền dưới dạng đối tượng thành chuỗi bằng cách sử dụng XmlConvert?

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

Nói cách khác, là có một cách tốt hơn thế này:

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(); 
     } 
    } 

Trả lời

0

Chỉ cần ném này trên mạng, được bạn cố gắng để chuyển đổi một đối tượng kinh doanh vào XML?

Có lẽ bạn có thể muốn xem xét XmlSerialization. Nếu bạn đánh dấu một số thuộc tính trên đối tượng kinh doanh của bạn. Net sẽ làm tất cả các công cụ XML ưa thích cho bạn :).

Ngoài ra, có bất kỳ lý do nào khiến bạn đánh đấm giá trị của mình không? XmlConvert.ToString() có 19 tình trạng quá tải, nhiều trong số đó có các nguyên thủy.

+0

Tôi đánh giá cao những người đứng đầu, nhưng tôi đã trải qua XmlSerializer, DataContractSerializer địa ngục. Tôi thậm chí còn chơi với XamlWriter. Giá trị của tôi được đóng hộp bởi vì tôi đang truy cập chúng thông qua một Giao diện có giao dịch với nhiều kiểu dữ liệu. –

2

Tất cả các loại giá trị vốn có thể được tuần tự hóa. Vì vậy, bạn chỉ cần sử dụng một XMLSerializer. Something như thế này sẽ làm điều đó (dựa trên phương pháp của bạn):

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

Điều buồn cười là nếu bạn sử dụng Reflector để theo dõi XmlSerializer.Serialize bạn cuối cùng nhấn một phương thức gọi là SerializePrimitive trong đó có một tuyên bố chuyển đổi lớn mà gửi đến phương pháp mà cuối cùng gọi XmlConvert.ToString nơi họ đúc đối tượng đến kiểu bản địa. –

+0

Nhưng đây có phải là một điều xấu? Tất cả những gì đang xảy ra là chuyển đổi được chuyển từ mã của bạn sang mã khung công tác. – DarkwingDuck

+1

Kết quả của ToXmlString (typeof (boolean), true) là true không phải là "chân thực". Kết quả phải được ánh xạ lại để làm cho nó hoạt động. Tôi thích cách "cứng" như đề xuất của Darrel. – Lakedaimon

1

Một lựa chọn khác là sử dụng Reflector để nhìn vào sau đó tạo một bản sao của System.Xml.Linq.XContainer.GetStringValue (đó là nội tiếc)

1

Tôi đã phải thực hiện chuyển đổi ngược lại ngược lại (chuỗi để nhập) như là một phần của bộ nối tiếp mà tôi muốn viết (tránh tích hợp trong một, vì lý do). Tôi đã làm deserialize và đây là bài duy nhất để nói về nó, vì vậy tôi đang cập nhật với câu trả lời của tôi trong khi nó vẫn còn tươi.

Phương pháp tôi đã sử dụng là sử dụng sự phản chiếu để tìm hiểu cơ bản những gì tôi cần làm. Loại biến trong ví dụ sau là đối tượng Type của loại tôi đang chuyển đổi sang, E là một XmlNode có nội dung tôi sẽ chuyển đổi và newVar là một thể hiện của một kiểu mẫu T mà tôi sẽ quay trở lại. đoạn này không chịu bất kỳ hạn chế về T (đó là lý do tại sao không có chuỗi trực tiếp assign/diễn viên) và giả định đối tượng/enums được xử lý khác nhau (các đối tượng và đếm phá vỡ này):

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[]{}); 
} 

(Chuỗi cần phải được xử lý như một trường hợp đặc biệt như ToString() làm một cái gì đó hoàn toàn khác và phá vỡ tất cả mọi thứ).

Một cách khác xung quanh (theo các bài bản gốc) sẽ là một cái gì đó tương tự (không dự thi, sẽ cập nhật nếu tôi viết hàm serialize):

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[]{}); 
} 

Trong trường hợp này, chuyển đổi từ T đến chuỗi và Giá trị chứa một loại T mà chúng tôi đang chuyển đổi. Sự khác biệt là chúng ta yêu cầu ToString nhưng chỉ định hàm với một tham số kiểu T. Điều này phải là duy nhất đủ.

Các vấn đề liên quan