2017-03-07 56 views
0

我到达此解决方案以将数值类型转换为泛型类型,但解决方案成为扩展开关案例。
使难以维护和每一个数学和比较作业的“功能”,我需要复制这...C#在通用数据类型和内置数值类型之间进行数值类型转换

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

目标是让这个类只能使用内置的数字类型。

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."); 
     } 
    } 
} 
+0

这就是让我松对C++模板的案例之一。 (这可能是在运行时发布几个实现的不错选择 – cdhowie

+0

不,C#中没有任何东西可以让你检测类型是否是数值类型,最好的办法是检测值类型,如果你能告诉我们你打算如何使用这些信息,可能会更容易给你一个更有用的建议。 –

+0

你如何使用'tuple'?它看起来像你只想要一个通用的'零'接口? – Lee

回答

1

如果你想为任意值转换成键入可以使用

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

一changeType已经全部原始数字类型之间的映射相互之间的转换。

如果它只是(数字类型,即0)指定的默认值,你可以使用

tuple[0] = default(TYPE); 
0

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

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