Обработка исключений в свойстве для неоднозначно типизированных данных, поступающих из веб-сервиса - PullRequest
1 голос
/ 07 мая 2009

Мне нужно использовать данные из веб-сервиса. Я получаю данные XML и использую их для создания объектов с помощью установщиков свойств.

В одном конкретном случае атрибут объекта (называемый «is_active» и указывающий, является ли объект активным или неактивным в приложении) представлен иногда

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

и в другое время

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

Код клиента требует, чтобы я представлял это, используя целые числа 1 и 0. Возвращенная строка «True» или «False» приводит к System.FormatException, как и ожидалось.

Какой самый изящный способ справиться с этой ситуацией?

Спасибо.

1 Ответ

1 голос
/ 07 мая 2009

Что вы используете для обработки данных? Поскольку это, очевидно, пользовательская сериализация, кажется, что вы должны иметь возможность настроить обработку "BooleanField" для обработки обоих ...

IMO, однако, вы не используете xml так, как это было задумано ... было бы проще указать это как элементы / атрибуты, например, как XmlSerializer (действительно - почему бы просто не использовать XmlSerializer?):

<isActive>true</isActive>

или

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

Обратите внимание, что стандарт xml для true / false - это строчные буквы ...


Дополнительно; если вы используете 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...