Преобразовать строки в типовые экземпляры - PullRequest
3 голосов
/ 24 февраля 2012

есть ли у вас альтернатива этому коду, я хочу более общий код Я пробовал конвертировать класс, но безуспешно

        public object convert(Type type, string value)
        {
            object r = null;
            if (type == typeof(bool))
            {
                r = bool.Parse(value);
            }            
            else if (type == typeof(int))
            {
                r = int.Parse(value);
            }
            else if (type == typeof(string))
            {
                r = value;
            }

            return r; 
        }

Ответы [ 4 ]

7 голосов
/ 24 февраля 2012
var conv = TypeDescriptor.GetConverter(type);
return conv.ConvertFromInvariantString(value);

Существуют другие операции преобразования, если вы не хотите использовать «инвариант». Это зависит от ваших потребностей. См. Также ConvertFromString, если вы хотите применить региональные настройки и т. Д.

6 голосов
/ 24 февраля 2012

Вы упоминаете, что пробовали класс Convert, но пробовали ли вы также Convert.ChangeType(value, type)?С какими проблемами вы столкнулись?

0 голосов
/ 15 апреля 2012

Convert.ChangeType() метод не преобразуется в нулевые типы, Guid, Enums и т. Д. Эта реализация ChangeType преобразует все это.

0 голосов
/ 24 февраля 2012

Как насчет создания словаря Dictionary<Type, Func<string, object>>?

Может быть что-то вроде этого:

public static class MyConverter
{
    private static Dictionary<Type, Func<string, object>> _Converters;

    static MyConverter()
    {
        _Converters = new Dictionary<Type, Func<string, object>>();

        // Add converter from available method
        _Converters.Add(typeof(double), MySpecialConverter);
        // Add converter as lambda
        _Converters.Add(typeof(bool), (text) => bool.Parse(text));
        // Add converter from complex lambda
        _Converters.Add(typeof(int), (text) =>
        {
            if (String.IsNullOrEmpty(text))
            {
                throw new ArgumentNullException("text");
            }

            return int.Parse(text);
        });
    }

    private static object MySpecialConverter(string text)
    {
        return double.Parse(text);
    }

    public static object Convert(Type type, string value)
    {
        Func<string, object> converter;

        if (!_Converters.TryGetValue(type, out converter))
        {
            throw new ArgumentException("No converter for type " + type.Name + " available.");
        }

        return converter(value);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...