Can I serialize Anonymous Types as xml?

后端 未结 7 2054
误落风尘
误落风尘 2020-11-27 04:48

I understood that anonymous types are marked private by the compiler and the properties are read-only. Is there a way to serialize them to xml (without deserialize) ? It wor

7条回答
  •  谎友^
    谎友^ (楼主)
    2020-11-27 05:21

    Something like this should get you started...

    class Program
    {
        static void Main(string[] args)
        {
            var me = new
            {
                Hello = "World",
                Other = new
                {
                    My = "Object",
                    V = 1,
                    B = (byte)2
                }
            };
    
            var x = me.ToXml();
        }
    }
    public static class Tools
    {
        private static readonly Type[] WriteTypes = new[] {
            typeof(string), typeof(DateTime), typeof(Enum), 
            typeof(decimal), typeof(Guid),
        };
        public static bool IsSimpleType(this Type type)
        {
            return type.IsPrimitive || WriteTypes.Contains(type);
        }
        public static XElement ToXml(this object input)
        {
            return input.ToXml(null);
        }
        public static XElement ToXml(this object input, string element)
        {
            if (input == null)
                return null;
    
            if (string.IsNullOrEmpty(element))
                element = "object";
            element = XmlConvert.EncodeName(element);
            var ret = new XElement(element);
    
            if (input != null)
            {
                var type = input.GetType();
                var props = type.GetProperties();
    
                var elements = from prop in props
                               let name = XmlConvert.EncodeName(prop.Name)
                               let val = prop.GetValue(input, null)
                               let value = prop.PropertyType.IsSimpleType()
                                    ? new XElement(name, val)
                                    : val.ToXml(name)
                               where value != null
                               select value;
    
                ret.Add(elements);
            }
    
            return ret;
        }
    }
    

    ... resulting xml ...

    
      World
      
        Object
        1
        2
      
    
    

提交回复
热议问题