3

私のプログラムでは、テーブルから SchemData を読み取っています。列のサイズを決定し、特定の値が列のサイズと一致し、その列に書き込むことができるかどうかを実行時に決定する必要があります。char、nvarchar などの英数字型の場合、これは問題ありません。

しかし、数値の場合、値を列サイズと比較することはできません。これは、ここでの私の理解が正しければ、列サイズによってその列内に格納するバイト数が得られるためです。

したがって、数値がその列の System.Type 変数内に格納されている特定のデータ型の MaxValue 範囲内にあるかどうかを確認したいと思います。

リフレクションを使用して MaxValue を決定し、そのような null 許容型を認識することから始めました。

public static Object GetMaxValue(this Type type)
{
    var t = GetNullableType(type);
    var f = t.GetField("MaxValue");
    if (f == null)
        return null;
    else
        return f.GetValue(null);
}

public static Type GetNullableType(Type type)
{
    Type retType = type;
    if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
    {
        var nullableConverter = new System.ComponentModel.NullableConverter(type);
        retType = nullableConverter.UnderlyingType;
    }
    return retType;
}

今度は、MaxValue 情報を格納するオブジェクトを取得します。

オブジェクト内に保存されている MaxValue を、別のオブジェクト (または文字列) 内に保存されている別の値と比較するにはどうすればよいですか。2 番目のオブジェクト (または前述の文字列) 内の値は xml ファイルから読み取られるため、int のような特定の型ではありません。型オブジェクトからのものである必要があります。

私が考えた比較を解決する唯一の方法は、メソッドを実装し、スイッチ内のすべての数値型をチェックし、try parse を実行して true/false を返すことでした。

最初の例のメソッドは次のようになります。

    public static bool TestMaxValue(this Type type, object compare)
    {
        var t = GetNullableType(type);
        var mv = t.GetMaxValue();
        bool ret = false;
        switch (Type.GetTypeCode(t))
        {
            case TypeCode.Byte:
                {
                    Byte b;
                    if (Byte.TryParse(compare.ToString(), out b))
                        ret =(Convert.ToByte(mv) >= b);

                    break;
                }
            case TypeCode.Decimal:
                {
                    Decimal b;
                    if (Decimal.TryParse(compare.ToString(), out b))
                        ret = (Convert.ToDecimal(mv) >= b);

                    break;
                }
            case TypeCode.Double:
                {
                    Double b;
                    if (Double.TryParse(compare.ToString(), out b))
                        ret = (Convert.ToDouble(mv) >= b);

                    break;
                }
            case TypeCode.Int16:
                {
                    Int16 b;
                    if (Int16.TryParse(compare.ToString(), out b))
                        ret = (Convert.ToInt16(mv) >= b);

                    break;
                }
            case TypeCode.Int32:
                {
                    Int32 b;
                    if (Int32.TryParse(compare.ToString(), out b))
                        ret = (Convert.ToInt32(mv) >= b);

                    break;
                }
        }
        return ret;
    }

そのような方法を実装するよりも良いアイデアを持っている人はいますか? 前もって感謝します。

4

1 に答える 1