TypeConverter не может преобразовать из System.String - PullRequest
5 голосов
/ 22 декабря 2011

Я пытаюсь преобразовать строку в соответствующий ей класс (т.е. "true" в true). И я получаю «TypeConverter не может преобразовать из System.String». Переданное значение равно "true".

Я неправильно вызываю метод?

public static T ToClass<T>(this IDictionary<string, string> source) where T : class, new()
{
    Type type = typeof(T);
    T ret = new T();

    foreach (var keyValue in source)
    {
        type.GetProperty(keyValue.Key).SetValue(ret, keyValue.Value.ToString().TestParse<T>(), null);
}

    return ret;
}

public static T TestParse<T>(this string value)
{
    return (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFromString(value);
}

Ответы [ 2 ]

6 голосов
/ 22 декабря 2011

Проблема в том, что T, который вы передаете методу TestParse, - это не тип bool, а тип класса, который вы хотите создать.Если вы измените строку на

public static bool TestParse(this string value)
    {
        return (bool)TypeDescriptor.GetConverter(typeof(bool)).ConvertFromString(value);
    }

, это работает для случая bool, но, очевидно, не для других случаев.Вам необходимо получить тип свойства, которое вы хотите установить с помощью отражения, и передать его методу TestParse.

public static T ToClass<T>(this IDictionary<string, string> source) where T : class, new()
{
    Type type = typeof(T);
    T ret = new T();

    foreach (var keyValue in source)
    {
        var propertyInfo = type.GetProperty(keyValue.Key);
        propertyInfo.SetValue(ret, keyValue.Value.ToString().TestParse(propertyInfo.PropertyType), null);
    }

    return ret;
}

public static object TestParse(this string value, Type type)
{
    return TypeDescriptor.GetConverter(type).ConvertFromString(value);
}

Я бы также изменил метод TestParse с метода расширения на обычныйметод, потому что он чувствует себя немного странно

1 голос
/ 22 декабря 2011

Сделайте, как это было сделано в этом ответе :

return (T)Convert.ChangeType(value, typeof(T));

, где T - целевой тип, а значение имеет тип string
РЕДАКТИРОВАТЬ: этоработает только для IConvertible разработчиков ...

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