代码之家  ›  专栏  ›  技术社区  ›  chefsmart

来自web服务的类型不明数据的属性中的异常处理

  •  1
  • chefsmart  · 技术社区  · 17 年前

    我需要使用Web服务中的数据。我正在接收xml数据,并使用它通过属性设置器创建对象。

    <field type="BooleanField" name="is_active">1</field>
    

    <field type="BooleanField" name="is_active">True</field>
    

    客户机代码要求我使用整数1和0来表示这一点。返回的字符串“True”或“False”将导致System.FormatException异常,如预期。

    处理这种情况最优雅的方法是什么?

    1 回复  |  直到 14 年前
        1
  •  1
  •   Marc Gravell    17 年前

    你用什么来处理数据?因为这显然是自定义序列化,所以您似乎应该能够调整“BooleanField”处理来处理这两个。。。

    不过,在我看来,你没有按预期的方式使用xml。。。更容易将其指定为元素/属性,例如 XmlSerializer XmlSerializer

    <isActive>true</isActive>
    

    或

    <foo ... isActive="true" ... />
    

    注意,true/false的xml标准是小写。。。


    此外,如果您正在使用 TypeConverter -您只需更改转换器:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    public class Program
    {
        static void Main()
        {
            TypeDescriptor.AddAttributes(typeof(bool),
                new TypeConverterAttribute(typeof(MyBooleanConverter)));
    
            TypeConverter conv = TypeDescriptor.GetConverter(typeof(bool));
            Console.WriteLine((bool)conv.ConvertFrom("True"));
            Console.WriteLine((bool)conv.ConvertFrom("true"));
            Console.WriteLine((bool)conv.ConvertFrom("False"));
            Console.WriteLine((bool)conv.ConvertFrom("false"));
            Console.WriteLine((bool)conv.ConvertFrom("0"));
            Console.WriteLine((bool)conv.ConvertFrom("1"));
        }
    }
    
    class MyBooleanConverter : BooleanConverter
    {
        static readonly Dictionary<string, bool> map
            = new Dictionary<string, bool>(StringComparer.OrdinalIgnoreCase)
            { { "true", true }, { "false", false },
              { "1", true }, { "0", false } };
    
        public override object ConvertFrom(ITypeDescriptorContext context,
            System.Globalization.CultureInfo culture, object value)
        {
            string s = value as string;
            bool result;
            if (!string.IsNullOrEmpty(s) && map.TryGetValue(s, out result))
            {
                return result;
            }
            return base.ConvertFrom(context, culture, value);
        }
    }