Проверьте, может ли строка быть преобразована в другой, различный тип - PullRequest
5 голосов
/ 22 ноября 2011

(решено) Я создаю приложение, которое может динамически создавать часть его элемента управления на основе некоторого описания из файла XML.
Теперь мне нужно нечто очень похожее на метод TryParse (): возможность проверить(без исключения throwing / catching), если текст в строковой переменной может быть преобразован (или проанализирован) в тип, имя которого у меня есть в другом variabe (myType).
Проблема в том, что myType может быть любымтипов .NET: DateTime, Bool, Double, Int32 и т. д.

Пример:

string testStringOk = "123";
string testStringWrong = "hello";
string myType = "System.Int32";

bool test1 = CanCovertTo(testStringOk, myType);      //true
bool test2 = CanCovertTo(testStringWrong, myType);   //false

Как должна выглядеть функция CanCovertTo(string testString, string testType)?

Наиболее близким является следующий код:

private bool CanCovertTo(string testString, string testType)
{
    Type type = Type.GetType(testType, null, null);
    TypeConverter converter = TypeDescriptor.GetConverter(type);

    converter.ConvertFrom(testString);  //throws exception when wrong type
    return true;
}

однако при попытке преобразования из неправильной строки выдается исключение, и я предпочитаю не использовать try {} catch() для этого.


Решение:

private bool CanCovertTo(string testString, string testType)
{
    Type type = Type.GetType(testType, null, null);
    TypeConverter converter = TypeDescriptor.GetConverter(type);
    return converter.IsValid(testString);
}

Ответы [ 3 ]

6 голосов
/ 22 ноября 2011

Вместо того, чтобы передавать тип как строку, вы должны использовать дженерики, например,

public bool CanConvert<T>(string data)
{
    TypeConverter converter = TypeDescriptor.GetConverter(typeof(T));
    return converter.IsValid(data);
}

Использование

bool test1 = CanConvert<Int32>("1234"); // true
bool test2 = CanConvert<Int32>("hello"); // false
6 голосов
/ 22 ноября 2011

Я бы проверил метод TypeConverter.IsValid , хотя:

Начиная с версии .NET Framework 4, метод IsValid перехватывает исключения из методов CanConvertFrom и ConvertFrom.Если тип входного значения заставляет CanConvertFrom возвращать false, или если входное значение заставляет ConvertFrom вызывать исключение, метод IsValid возвращает false.

Это означает, что если вы не используете try ... поймайте сами, вы собираетесь конвертировать в два раза больше значения.

0 голосов
/ 22 ноября 2011

Если это просто встроенные типы .NET, вы можете выполнить преобразование на основе System.TypeCode.Вы можете сохранить код типа в вашем XML (или преобразовать строку типа в код типа) и сделать что-то вроде:

switch (code)
{
    case TypeCode.Boolean:
        bool.TryParse(value, out result);
        break;
    case TypeCode.Int32:
        int.TryParse(value, out result);
    ...
}
...