0

このコード スニペットは、オブジェクトのプロパティの値を検証することを目的としています。

最小範囲と最大範囲は、Nhibernate .hbm ファイルのような .xml ファイルとして提供されます。

プロパティのデータ型も .xml ファイルから読み取られるため、プロパティの型は実行時にしかわかりません。

C#.NET 2.0のコードを改善するより良い方法はありますか?

public static void ValidateMinMax(Property prop, Object value)
    {
        Type type = Type.GetType(prop.TypeName);

        Object minValue = PropertyDataExtractor.GetMinValue(prop);
        Object maxValue = PropertyDataExtractor.GetMaxValue(prop);
        Object actualVaue = null;

        bool minValueOk = false;
        bool maxValueOk = false;

        if (minValue != null)
        {
            switch (type.Name)
            {
                case "Boolean":
                    break;

                case "SByte":
                    actualVaue = Convert.ToSByte(value);
                    if (actualVaue != null)
                    {
                        minValueOk = ((sbyte)minValue) <= ((sbyte)actualVaue);
                    }
                    else
                    {
                        minValue = true;
                    }
                    break;

                case "Byte":
                    actualVaue = Convert.ToByte(value);
                    if (actualVaue != null)
                    {
                        minValueOk = ((byte)minValue) <= ((byte)actualVaue);
                    }
                    else
                    {
                        minValue = true;
                    }
                    break;

                case "Byte[]":
                    break;

                case "DateTime":
                    actualVaue = Convert.ToDateTime(value);

                    if (actualVaue != null)
                    {
                        minValueOk = ((DateTime)minValue).Date <= ((DateTime)actualVaue).Date;
                    }
                    else
                    {
                        minValue = true;
                    }
                    break;

                case "Int16":
                    actualVaue = Convert.ToInt16(value);
                    if (actualVaue != null)
                    {
                        minValueOk = ((short)minValue) <= ((Int16)actualVaue);
                    }
                    else
                    {
                        minValue = true;
                    }
                    break;

                case "Int32":
                    actualVaue = Convert.ToInt32(value);
                    if (actualVaue != null)
                    {
                        minValueOk = ((int)minValue) <= ((Int32)actualVaue);
                    }
                    else
                    {
                        minValue = true;
                    }
                    break;

                case "Int64":
                    actualVaue = Convert.ToInt64(value);
                    if (actualVaue != null)
                    {
                        minValueOk = ((long)minValue) <= ((Int64)actualVaue);
                    }
                    else
                    {
                        minValue = true;
                    }
                    break;

                case "Single":
                    actualVaue = Convert.ToByte(value);
                    if (actualVaue != null)
                    {
                        minValueOk = ((float)minValue) <= ((Single)actualVaue);
                    }
                    else
                    {
                        minValue = true;
                    }
                    break;

                case "Double":
                    actualVaue = Convert.ToByte(value);
                    if (actualVaue != null)
                    {
                        minValueOk = ((double)minValue) <= ((double)actualVaue);
                    }
                    else
                    {
                        minValue = true;
                    }
                    break;

                case "Decimal":
                    actualVaue = Convert.ToByte(value);
                    if (actualVaue != null)
                    {
                        minValueOk = ((decimal)minValue) <= ((decimal)actualVaue);
                    }
                    else
                    {
                        minValue = true;
                    }
                    break;

                case "Char":
                    actualVaue = Convert.ToChar(value);
                    if (actualVaue != null)
                    {
                        minValueOk = ((char)minValue) <= ((char)actualVaue);
                    }
                    else
                    {
                        minValue = true;
                    }
                    break;

                case "String":
                    actualVaue = Convert.ToString(value);
                    if (actualVaue != null)
                    {
                        minValueOk = ((int)minValue) <= ((string)actualVaue).Length;
                    }
                    else
                    {
                        minValue = true;
                    }
                    break;

                case "Guid":
                    break;
            }
        }

        if (maxValue != null)
        {
            switch (type.Name)
            {
                case "Boolean":
                    break;

                case "SByte":
                    actualVaue = Convert.ToSByte(value);
                    if (actualVaue != null)
                    {
                        maxValueOk = ((sbyte)minValue) >= ((sbyte)actualVaue);
                    }
                    else
                    {
                        maxValue = true;
                    }
                    break;

                case "Byte":
                    actualVaue = Convert.ToByte(value);
                    if (actualVaue != null)
                    {
                        maxValueOk = ((byte)minValue) >= ((byte)actualVaue);
                    }
                    else
                    {
                        maxValue = true;
                    }
                    break;

                case "Byte[]":
                    break;

                case "DateTime":
                    actualVaue = Convert.ToDateTime(value);
                    if (actualVaue != null)
                    {                            
                        maxValueOk = ((DateTime)maxValue).Date >= ((DateTime)actualVaue).Date;
                    }
                    else
                    {
                        maxValue = true;
                    }
                    break;

                case "Int16":
                    actualVaue = Convert.ToInt16(value);
                    if (actualVaue != null)
                    {
                        maxValueOk = ((short)minValue) >= ((Int16)actualVaue);
                    }
                    else
                    {
                        maxValue = true;
                    }
                    break;

                case "Int32":
                    actualVaue = Convert.ToInt32(value);
                    if (actualVaue != null)
                    {
                        maxValueOk = ((int)minValue) >= ((Int32)actualVaue);
                    }
                    else
                    {
                        maxValue = true;
                    }
                    break;

                case "Int64":
                    actualVaue = Convert.ToInt64(value);
                    if (actualVaue != null)
                    {
                        maxValueOk = ((long)minValue) >= ((Int64)actualVaue);
                    }
                    else
                    {
                        maxValue = true;
                    }
                    break;

                case "Single":
                    actualVaue = Convert.ToByte(value);
                    if (actualVaue != null)
                    {
                        maxValueOk = ((float)minValue) >= ((Single)actualVaue);
                    }
                    else
                    {
                        maxValue = true;
                    }
                    break;

                case "Double":
                    actualVaue = Convert.ToByte(value);
                    if (actualVaue != null)
                    {
                        maxValueOk = ((double)minValue) >= ((double)actualVaue);
                    }
                    else
                    {
                        maxValue = true;
                    }
                    break;

                case "Decimal":
                    actualVaue = Convert.ToByte(value);
                    if (actualVaue != null)
                    {
                        maxValueOk = ((decimal)minValue) >= ((decimal)actualVaue);
                    }
                    else
                    {
                        maxValue = true;
                    }
                    break;

                case "Char":
                    actualVaue = Convert.ToChar(value);
                    if (actualVaue != null)
                    {
                        maxValueOk = ((char)minValue) >= ((char)actualVaue);
                    }
                    else
                    {
                        maxValue = true;
                    }
                    break;

                case "String":
                    actualVaue = Convert.ToString(value);
                    if (actualVaue != null)
                    {
                        maxValueOk = ((int)maxValue) >= ((string)actualVaue).Length;
                    }
                    else
                    {
                        maxValue = true;
                    }
                    break;

                case "Guid":
                    break;
            }
        }

        if (minValue == null)
        {
            minValueOk = true;
        }

        if (maxValue == null)
        {
            maxValueOk = true;
        }

        if (!(minValueOk && maxValueOk))
        {
            throw new Exception("Property : " + PropertyDataExtractor.GetName(prop) +".\nMessage : "+ PropertyDataExtractor.GetMinValueErrorMessage(prop) + " " + PropertyDataExtractor.GetMaxValueErrorMessage(prop));
        }
        else if (!minValueOk)
        {
            throw new Exception("Property : " + PropertyDataExtractor.GetName(prop) + ".\nMessage : " + PropertyDataExtractor.GetMinValueErrorMessage(prop));
        }
        else if (!maxValueOk)
        {
            throw new Exception("Property : " + PropertyDataExtractor.GetName(prop) + ".\nMessage : " + PropertyDataExtractor.GetMaxValueErrorMessage(prop));
        }
    }
}
4

1 に答える 1