7

次の型のオーバーロードされた静的TryParseメソッドを作成しました: 、、、、、、および。以下は実装の一部です。Nullableint?short?long?double?DateTime?decimal?float?bool?byte?char?

protected static bool TryParse(string input, out int? value)
{
    int outValue;
    bool result = Int32.TryParse(input, out outValue);
    value = outValue;
    return result;
}

protected static bool TryParse(string input, out short? value)
{
    short outValue;
    bool result = Int16.TryParse(input, out outValue);
    value = outValue;
    return result;
}

protected static bool TryParse(string input, out long? value)
{
    long outValue;
    bool result = Int64.TryParse(input, out outValue);
    value = outValue;
    return result;
}

ロジックは、異なる型を使用することを除いて、すべてのメソッドで同じです。冗長なコードをあまり必要としないように、ジェネリックを使用することはできないでしょうか? 署名は次のようになります。

bool TryParse<T>(string input, out T value);

ありがとう

4

3 に答える 3

9

冗長なコードをあまり必要としないように、ジェネリックを使用することはできないでしょうか?

リフレクションでそれを行うこともできますが、それは比較的遅くなります。それ以外の場合は、タイプから「そのタイプに使用するメソッド」へのマップを作成できますが、それはかなり醜いものになります。それ以外は別として、真にジェネリックにTryParseなることはありません。コンパイル時に認識できない正しいシグネチャのメソッドを提供する型に対してのみ機能します。

ちなみに、私は個人的に署名と動作を変更することを検討しています。現在、 の型valueは null 許容ですが、 を返しても、メソッドの最後に null 値が含まれることはありませんfalsenull戻り値を解析操作の結果にして、失敗時に返すようにしないのはなぜですか?

protected static long? TryParseInt64(string input)
{
    long outValue;
    return Int64.TryParse(input, out outValue) ? (long?) outValue : null;
}
于 2013-05-31T07:07:54.310 に答える
8

次の一般的な拡張メソッドを使用できます。

public static Nullable<TSource> TryParse<TSource>(this string input) where TSource : struct
{
    try
    {
        var result = Convert.ChangeType(input, typeof(TSource));
        if (result != null)
        {
            return (TSource)result;
        }
        return null;
    }
    catch (Exception)
    {
        return null;
    }
}

次の呼び出しは、null 許容の解析済みの型を返します。

string s = "510";
int? test = s.TryParse<int>();
//TryParse Returns 510 and stored in variable test.

string s = "TestInt";
int? test = s.TryParse<int>();
//TryParse Returns null and stored in variable test.
于 2013-05-31T07:30:37.397 に答える
4

余談ですが、コードをリファクタリングできます。

public static bool TryParse(string input, out int? value)
{
    return TryParse(input, Int32.TryParse, out value);
}

protected static bool TryParse(string input, out short? value)
{
    return TryParse(input, Int16.TryParse, out value);
}

protected static bool TryParse(string input, out long? value)
{
    return TryParse(input, Int64.TryParse, out value);
}

private static bool TryParse<T>(string input, TryParseFunc<T> tryParse, out T? value)
    where T : struct
{
    T outValue;
    bool result = tryParse(input, out outValue);
    value = outValue;
    return result;
}

private delegate bool TryParseFunc<T>(string input, out T value);
于 2013-05-31T07:24:51.507 に答える