如何使用XmlConvert将作为对象的值类型转换为字符串?

时间:2009-01-26 01:47:18

标签: c# xml

我正在寻找与下面的代码等效的东西但是对于任何值类型而不必为每种数据类型编码switch语句。 下面的代码无法编译,因为XmlConvert.ToString()没有接受和反对的重载。

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

4 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:1)

另一个选择是使用Reflector来查看然后制作System.Xml.Linq.XContainer.GetStringValue的副本(它内部不幸)

答案 2 :(得分:1)

我不得不做相反的反向转换(字符串到类型)作为我想写的序列化器的一部分(避免内置的转换,原因)。我正在进行反序列化,这是唯一一个谈论它的帖子,所以我正在用我的答案进行更新,而它仍然很新鲜。

我使用的方法是使用反射来基本解决我需要做的事情。以下示例中的变量类型是我要转换为的类型的Type对象,E是一个XmlNode,其内容我将要转换,newVar是我将要返回的模板类型T的实例。这个片段不假设对T的任何约束(这就是没有直接字符串赋值/强制转换的原因)并且假设对象/枚举的处理方式不同(对象和枚举会破坏它):

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的参数指定函数。这应该足够独特。

答案 3 :(得分:0)

只是想把它扔出去,你是否试图将业务对象转换为XML?

也许你可能想看一下XmlSerialization。如果你在业务对象上标记一些属性.Net将为你做所有奇特的XML工作:)。

另外,你有什么理由装箱你的价值吗? XmlConvert.ToString()有19个重载,其中许多都是基元。