Я пытаюсь создать универсальное расширение, которое использует 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;
}
}
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; }
ConvertFrom(value)
метод вtry-catch
блоке, чтобы поймать исключения.Ответы:
Вы должны использовать класс TypeDescriptor :
источник