Си диез / Говнокод #16378 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 mrg, (Updated )

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

        • Ох епт, шарпы умеют свитч по интегральным типам и строкам. Результат 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)
      };
      Ответить

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

Из-за тебя ушел bormand, guest!

    А не использовать ли нам bbcode?


    8