3

検証方法を書こうとしています。例: double の場合は次のようになります。

   protected bool ValidateLoopAttributes(string i_value, double i_threshold)
       {
        double result;
        if (!(double.TryParse(i_value, out result) && result >= i_threshold))
        {
            return false;
        }
        return true;
    }

これを次のように書くことは可能ですか?

     protected bool ValidateLoopAttributes<T>(string i_value, T i_threshold)

そして、次のようなものを使用します

             T.GetType().TryParse() // how can i use here the type's methods??

これを行う唯一の方法は、switch/if ステートメントを使用することですか? 例えば:

    If (T.GetType() is int) 
        Int32.TryParse(i_threshold)

もっとエレガントな方法はありますか?

4

4 に答える 4

1

現在、メソッド内で解析とビジネス ルールの 2 つを混在させています。あなたが呼び出すValidateLoopAttributes(value, 4)と考えて、それが返されますfalse。考えられる理由:

  1. 文字列に値が含まれていません。例: 空、一部の文字など。
  2. 文字列に整数値が含まれていません。たとえば、2 倍の値があります。
  3. 文字列に整数値が含まれていますが、しきい値を超えています。
  4. タイプにコンバーターが定義されていません。

最初のケースでは、ソースに無効なデータがあります。2 番目のケースでは、無効なコードがあり、代わりに double を使用する必要があります。3 番目のケースでは、コードは問題ありませんが、ビジネス ルールが破られています。最後のケース (これは double や integer の場合ではありませんが、型に制限のないジェネリック コードを記述した場合、他のユーザーが任意の型で呼び出すことを許可します) もコードの問題です。

したがって、ビジネス ルールを分離してデータを解析することを検討してください。

Foo foo = Parse(xml);
RunBusinessRules(foo); 
于 2012-04-13T09:35:41.570 に答える
1
public static bool ValidateLoopAttributes<T>(string value, T threshold)
    where T : IComparable
{
    try
    {
        var parseMethod = typeof(T).GetMethod("Parse", new[] {typeof (string)});
        var result = (T) parseMethod.Invoke(null, new object[] {value});
        return result.CompareTo(threshold) < 0;
    }
    catch (Exception)
    {
        return false;
    }
}

明らかに、これは静的な Parse メソッドを持つ型に対してのみ機能します。

于 2012-04-13T09:31:32.757 に答える
1

これを試して:

static class Ext
{
    public static bool TryParse<T>(string s, out T value)
    {
        TypeConverter converter = TypeDescriptor.GetConverter(typeof(T));
        try
        {
            value = (T)converter.ConvertFromString(s);
            return true;
        }
        catch
        {
            value = default(T);
            return false;
        }
    }
    public static bool ValidateLoopAttributes<T>(string i_value, T i_threshold) 
           where T : IComparable
    {
        T outval;
        if (TryParse<T>(i_value, out outval))
            return outval.CompareTo(i_threshold) >= 0;
        else return false;
    }
}

私の答えは、ここから取ったMarc Gravellの答えを使用しています。
これでできること

bool b1 = Ext.ValidateLoopAttributes<int>("5", 4);
bool b2 = Ext.ValidateLoopAttributes<double>("5.4", 5.5d);

便利な場合は、拡張メソッドを使用することもできます

public static bool ValidateLoopAttributes<T>(this string i_value, T i_threshold) 
       where T : IComparable { }

これはあなたを使用するように導きます

bool b1 = "5".ValidateLoopAttributes<int>(4);
bool b2 = "5.4".ValidateLoopAttributes<double>(5.5d);
于 2012-04-13T09:10:13.393 に答える
0

これが整数かどうかを確認するには、次のようなものを使用できます。

public static bool IsNumericValue(string val, System.Globalization.NumberStyles NumberStyle)
{
    double result;
    return Double.TryParse(val,NumberStyle,
        System.Globalization.CultureInfo.CurrentCulture,out result);
}

すぐ

 IsNumericValue("1.2", System.Globalization.NumberStyles.Integer) // FALSE 

そして

 IsNumericValue("12", System.Globalization.NumberStyles.Integer)  // TRUE

私が使用したこの例では、異なる場合はニーズにCurrectCulture合わせてください。

于 2012-04-13T09:01:24.150 に答える