Я пытаюсь создать универсальное расширение, которое использует TryParse, чтобы проверить, является ли строка данного типа:
public static bool Is<T>(this string input)
{
T notUsed;
return T.TryParse(input, out notUsed);
}
это не скомпилируется, так как не может разрешить символ «TryParse»
Как я понимаю, «TryParse» не является частью какого-либо интерфейса.
Можно ли вообще это сделать?
Обновить:
Используя ответы ниже, я придумал:
public static bool Is<T>(this string input)
{
try
{
TypeDescriptor.GetConverter(typeof(T)).ConvertFromString(input);
}
catch
{
return false;
}
return true;
}
Это работает довольно хорошо, но я думаю, что использование исключений таким образом не подходит мне.
Update2:
Изменен для передачи типа, а не для использования обобщений:
public static bool Is(this string input, Type targetType)
{
try
{
TypeDescriptor.GetConverter(targetType).ConvertFromString(input);
return true;
}
catch
{
return false;
}
}
1
Я думаю, что в этом общем случае вам просто придется иметь дело с исключением Kludge. Вы можете добавить кейсы, чтобы проверять такие вещи, как int или double, а затем использовать определенные методы TryParse, но вам все равно придется воспользоваться этим, чтобы перехватывать другие типы.
—
Люк
Использование общего не является необходимым. Просто введите тип в качестве параметра. public static bool Is (это строка ввода, типа targetType). Этот способ вызова выглядит немного красивее: x.Is (typeof (int)) -VS- x.Is <int> ()
—
mikesigs
В конвертере есть метод IsValid, чтобы вы могли проверить, не возникнут ли проблемы с конвертацией. Я использовал метод ниже и, кажется, работает нормально.
—
CastroXXL
protected Boolean TryParse<T>(Object value, out T result) { result = default(T); var convertor = TypeDescriptor.GetConverter(typeof(T)); if (convertor == null || !convertor.IsValid(value)) { return false; } result = (T)convertor.ConvertFrom(value); return true; }
@CastroXXL Спасибо за проявленный интерес к этому вопросу, однако ваш метод не вполне сработает, так как я хотел проверить, было ли строковое значение определенного типа, а не объекта, хотя ваш метод был бы полезен для типов объектов (но нужно обернуть
—
Пирс Майерс
ConvertFrom(value)
метод в try-catch
блоке, чтобы поймать исключения.
Вы должны проверить, если (targetType == null), потому что первое использование этого в вашем коде может выдать, но это исключение будет поглощено вашим уловом.
—
Ник Струпат,