用于检查字符串是否为有效整数、双精度、布尔值等的扩展方法



我正在尝试为string创建一个扩展方法,用于说明字符串是有效的整数、双精度、布尔值还是十进制。我对开关不感兴趣。。case并尝试使用泛型。

扩展方法

public static bool Is<T>(this string s)
{
   ....
}

用法

string s = "23";
if(s.Is<int>())
{
   Console.WriteLine("valid integer");
}

我没能成功地实现扩展方法。我正在寻找一些想法/建议。。。

这可能使用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;
}

从这里拍摄。

使用锥虫:

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");
}

这就是您想要的;

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");
}

最新更新