Я пытаюсь создать общее расширение, которое использует «TryParse», чтобы проверить, является ли строка данного типа:Generic TryParse
public static bool Is<T>(this string input)
{
T notUsed;
return T.TryParse(input, out notUsed);
}
это не будет компилироваться, как он не может разрешить символ «TryParse»
Как я понимаю, «TryParse» не является частью какого-либо интерфейса.
Возможно ли это вообще сделать?
Update:
Используя ответы ниже я придумал:
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;
}
}
я думаю, что в этом общем случае вам просто придется иметь дело с клуджем исключения. вы можете добавить случаи для проверки таких вещей, как ints или double, а затем использовать определенные методы TryParse, но вам все равно придется отказаться от этого, чтобы поймать другие типы. – luke
Использование генератора не требуется. Просто введите Type в качестве параметра. public static bool Is (этот ввод строки, тип targetType). Этот способ вызова выглядит немного красивее: x.Is (typeof (int)) -VS- x.Is() –
mikesigs
На конвертере есть метод IsValid, чтобы вы могли проверить, будут ли проблемы с преобразованием. Я использовал метод ниже и, кажется, работает нормально. 'protected Boolean TryParse (значение объекта, вне результата T) { результат = по умолчанию (T); var convertor = TypeDescriptor.GetConverter (typeof (T)); if (convertor == null ||! Convertor.IsValid (value)) {return false; } result = (T) convertor.ConvertFrom (значение); return true; } ' –
CastroXXL