C#通用和内置数字类型之间的数字类型转换

时间:2017-03-07 19:03:15

标签: c# generics types casting

我找到了这个解决方案,试图将数字类型转换为通用类型,但解决方案变成了一个广泛的切换案例 由于难以维护以及与数学和比较操作一起工作的每个“功能”,我需要复制这个......

有没有办法减少,简化这种转换?还要考虑数值数据类型是否接受负值?

此类的目标是仅使用内置数值类型。

public class Foo<TYPE>
{
    private static TYPE[] tuple = new TYPE[3]

    public DoSomething()
    {
       switch (Type.GetTypeCode(typeof(TYPE)))
        {
            // Built-in Byte type.
            case TypeCode.Byte:
                tuple[0] = (TYPE)(object)(byte)0;
                tuple[1] = (TYPE)(object)(byte)0;
                tuple[2] = (TYPE)(object)(byte)0;
                break;

            // Built-in Signed Byte type.
            case TypeCode.SByte:
                tuple[0] = (TYPE)(object)(sbyte)0;
                tuple[1] = (TYPE)(object)(sbyte)0;
                tuple[2] = (TYPE)(object)(sbyte)0;
                break;

            // Built-in Short Integer type.
            case TypeCode.Int16:
                tuple[0] = (TYPE)(object)(short)0;
                tuple[1] = (TYPE)(object)(short)0;
                tuple[2] = (TYPE)(object)(short)0;
                break;

            // Built-in Unsigned Short Integer type.
            case TypeCode.UInt16:
                tuple[0] = (TYPE)(object)(ushort)0;
                tuple[1] = (TYPE)(object)(ushort)0;
                tuple[2] = (TYPE)(object)(ushort)0;
                break;
            default:
                throw new Exception("The generic type is not a built-in numeric type.");
         }
    }
}

2 个答案:

答案 0 :(得分:1)

如果要将任意值转换为TYPE,可以使用

tuple[0] = Convert.ChangeType(value, typeof(TYPE));

ChangeType已经在所有原始数字类型之间进行映射,以便相互转换。

如果只是分配默认值(即数字类型为0),您可以使用

tuple[0] = default(TYPE);

答案 1 :(得分:0)

如果type是数字内置类型,您可以使用default关键字来获得类型的0(零):

for (int i = 0; i < 3; i ++)
    tuple[i] = default(TYPE);