我正在尝试创建一个扩展方法来string
说明字符串是有效的整数、双精度、布尔还是小数。我对switch..case和尝试使用泛型不感兴趣。
扩展方法
public static bool Is<T>(this string s)
{
....
}
用法
string s = "23";
if(s.Is<int>())
{
Console.WriteLine("valid integer");
}
我无法成功实现扩展方法。我正在寻找一些想法/建议......
我正在尝试创建一个扩展方法来string
说明字符串是有效的整数、双精度、布尔还是小数。我对switch..case和尝试使用泛型不感兴趣。
扩展方法
public static bool Is<T>(this string s)
{
....
}
用法
string s = "23";
if(s.Is<int>())
{
Console.WriteLine("valid integer");
}
我无法成功实现扩展方法。我正在寻找一些想法/建议......
使用 tryparse :
string someString = "42";
int result;
if(int.TryParse(someString, out result))
{
// It's ok
Console.WriteLine("ok: " + result);
}
else
{
// it's not ok
Console.WriteLine("Shame on you");
}
这可能使用以下Cast<>()
方法起作用:
public static bool Is<T>(this string s)
{
bool success = true;
try
{
s.Cast<T>();
}
catch(Exception)
{
success = false;
}
return success;
}
编辑
显然这并非每次都有效,所以我在这里找到了另一个工作版本:
public static bool Is<T>(this string input)
{
try
{
TypeDescriptor.GetConverter(typeof(T)).ConvertFromString(input);
}
catch
{
return false;
}
return true;
}
取自这里。
这就是你想要的;
public static bool Is<T>(this string s)
{
TypeConverter converter = TypeDescriptor.GetConverter(typeof(T));
try
{
object val = converter.ConvertFromInvariantString(s);
return true;
}
catch
{
return false;
}
}
实现示例:
public static class StringExtensions
{
public static bool Is<T>(this string s)
{
if (typeof(T) == typeof(int))
{
int tmp;
return int.TryParse(s, out tmp);
}
if (typeof(T) == typeof(long))
{
long tmp;
return long.TryParse(s, out tmp);
}
...
return false;
}
}
用法:
var test1 = "test".Is<int>();
var test2 = "1".Is<int>();
var test3 = "12.45".Is<int>();
var test4 = "45645564".Is<long>();
另请注意,您应该将一些其他参数作为方法的输入,例如IFormatProvider
让用户指定要使用的文化。
我会使用 try/catch
string a = "23";
try{
int b = a;
Console.WriteLine("valid integer");
}
catch
{
Console.WriteLine("invalid integer");
}