1. C# / Говнокод #16378

    +132

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    private NpgsqlDbType GetDbType(Type clrType, bool large = false)
            {
                if (clrType == null)
                    throw new ArgumentNullException("clrType");
    
                // Try to get underlying type if it is nullable type.
                clrType = Nullable.GetUnderlyingType(clrType) ?? clrType;
    
                if (clrType == typeof(int) || clrType == typeof(uint))
                {
                    return NpgsqlDbType.Integer;
                }
                else if (clrType == typeof(byte) || clrType == typeof(sbyte) || clrType == typeof(short) || clrType == typeof(ushort))
                {
                    return NpgsqlDbType.Smallint;
                }
                else if (clrType == typeof(long) || clrType == typeof(ulong))
                {
                    return NpgsqlDbType.Bigint;
                }
                else if (clrType == typeof(double))
                {
                    return NpgsqlDbType.Double;
                }
                else if (clrType == typeof(float))
                {
                    return NpgsqlDbType.Real;
                }
                else if (clrType == typeof(decimal))
                {
                    return NpgsqlDbType.Numeric;
                }
                else if (clrType == typeof(bool))
                {
                    return NpgsqlDbType.Boolean;
                }
                else if (clrType == typeof(string))
                {
                    return large ? NpgsqlDbType.Text : NpgsqlDbType.Varchar;
                }
                else if (clrType == typeof(char))
                {
                    return NpgsqlDbType.Char;
                }
                else if (clrType == typeof(DateTime))
                {
                    return NpgsqlDbType.Timestamp;
                }
                else if (clrType == typeof(Guid))
                {
                    return NpgsqlDbType.Uuid;
                }
                else if (typeof(Array).IsAssignableFrom(clrType))
                {
                    return NpgsqlDbType.Array | GetDbType(clrType.GetElementType(), large);
                }
                else
                    throw new NotSupportedException(string.Format("Not supported clr type {0} to convert {1}.", clrType.FullName, typeof(NpgsqlDbType).FullName));
            }

    определение типа

    Запостил: mrg, 18 Июля 2014

    Комментарии (9) RSS

    • Автор не умеет в switch?
      Ответить
      • не автор, а язык. Учи матчасть.
        Ответить
        • Можно и свичом.
          Если от объекта взять TypeCode (http://msdn.microsoft.com/en-us/library/system.convert.gettypecode%28v=vs.110%29 .aspx)
          Ответить
        • язык умет. сам учи матчасть
          Ответить
          • Ох епт, шарпы умеют свитч по интегральным типам и строкам. Результат typeof к ним не относится. Сделать преобразование в нужный тип средствами библиотеки или своими руками - это уже совсем другая история.
            Ответить
            • контекст не посмотрел. Ладно, не учи матчасть
              Ответить
        • дело даже не в свичах или ифах. А если в обратную сторону понадобится? Еще один мегаметод городить? И поддерживать один и тот же байндинг в разных местах?
          Ответить
    • System.Convert.ChangeType тоже креативом не отличается:
      public static object ChangeType(object value, Type conversionType, IFormatProvider provider)
      {
      	if (conversionType == null)
      		....
      	if (value == null)
      	    ....
      	else
      	{
      		IConvertible convertible = value as IConvertible;
      		if (convertible == null)
      		    ....
      		else
      		{
      			RuntimeType left = conversionType as RuntimeType;
      			if (left == Convert.ConvertTypes[3])
      				return convertible.ToBoolean(provider);
      			if (left == Convert.ConvertTypes[4])
      				return convertible.ToChar(provider);
      			if (left == Convert.ConvertTypes[5])
      				return convertible.ToSByte(provider);
      			if (left == Convert.ConvertTypes[6])
      				return convertible.ToByte(provider);
      			if (left == Convert.ConvertTypes[7])
      				return convertible.ToInt16(provider);
      			if (left == Convert.ConvertTypes[8])
      				return convertible.ToUInt16(provider);
      			if (left == Convert.ConvertTypes[9])
      				return convertible.ToInt32(provider);
      			if (left == Convert.ConvertTypes[10])
      				return convertible.ToUInt32(provider);
      			if (left == Convert.ConvertTypes[11])
      				return convertible.ToInt64(provider);
      			if (left == Convert.ConvertTypes[12])
      				return convertible.ToUInt64(provider);
      			if (left == Convert.ConvertTypes[13])
      				return convertible.ToSingle(provider);
      			if (left == Convert.ConvertTypes[14])
      				return convertible.ToDouble(provider);
      			if (left == Convert.ConvertTypes[15])
      				return convertible.ToDecimal(provider);
      			if (left == Convert.ConvertTypes[16])
      				return convertible.ToDateTime(provider);
      			if (left == Convert.ConvertTypes[18])
      				return convertible.ToString(provider);
      			if (left == Convert.ConvertTypes[1])
      				return value;
      			return convertible.ToType(conversionType, provider);
      		}
      	}
      }
      Ответить
      • Хотя автор в M$ .cctor использовал:
        internal static readonly RuntimeType[] ConvertTypes = new RuntimeType[]
        {
        	(RuntimeType)typeof(Empty),
        	(RuntimeType)typeof(object),
        	(RuntimeType)typeof(DBNull),
        	(RuntimeType)typeof(bool),
        	(RuntimeType)typeof(char),
        	(RuntimeType)typeof(sbyte),
        	(RuntimeType)typeof(byte),
        	(RuntimeType)typeof(short),
        	(RuntimeType)typeof(ushort),
        	(RuntimeType)typeof(int),
        	(RuntimeType)typeof(uint),
        	(RuntimeType)typeof(long),
        	(RuntimeType)typeof(ulong),
        	(RuntimeType)typeof(float),
        	(RuntimeType)typeof(double),
        	(RuntimeType)typeof(decimal),
        	(RuntimeType)typeof(DateTime),
        	(RuntimeType)typeof(object),
        	(RuntimeType)typeof(string)
        };
        Ответить

    Добавить комментарий