3

string文字列が有効な整数、double、bool、またはdecimalのいずれであるかを示す拡張メソッドを作成しようとしています。switch..caseやジェネリックスの使用には興味がありません。

拡張方法

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

使用法

string s = "23";

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

拡張メソッドの実装に成功できませんでした。私はいくつかのアイデア/提案を探しています...

4

5 に答える 5

4

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");
}
于 2012-08-31T09:59:08.797 に答える
3

これは、次の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;
}

ここから撮影。

于 2012-08-31T09:58:15.927 に答える
2

これはあなたが望むものです。

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;
    }
}
于 2012-08-31T10:03:25.180 に答える
1

実装例:

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また、ユーザーが使用するカルチャを指定できるようにするなど、メソッドの入力として他のパラメータを使用する必要があることにも注意してください。

于 2012-08-31T10:02:28.757 に答える
-2

私はtry/catchを使用します

string a = "23";

try{

int b = a;

Console.WriteLine("valid integer");

}
catch
{
Console.WriteLine("invalid integer");
}
于 2012-08-31T09:57:34.040 に答える