【问题标题】:C# Numeric type casting between a generic and Built-in numeric type泛型和内置数字类型之间的 C# 数字类型转换
【发布时间】:2017-03-07 19:03:14
【问题描述】:

我找到这个解决方案是为了将数字类型转换为泛型类型,但该解决方案变成了一个广泛的开关案例。
难以维护以及适用于数学和比较运算的每个“功能”,我需要复制它......

有什么方法可以减少、简化这种转换?还要考虑数值数据类型是否接受负值?

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

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

【问题讨论】:

  • 这是让我非常喜欢 C++ 模板的案例之一。 :( 这可能是在运行时发出一些实现的不错选择。
  • 不,C# 中没有任何内容可以让您检测类型是否为数字类型。你能做的最好的就是检测值类型。也就是说,我不清楚你到底想要完成什么。如果您能告诉我们您打算如何使用这些信息,那么给您提供更有用的建议可能会更容易。
  • 你如何使用tuple?看起来你只想要一个通用的Zero 接口?

标签: c# generics types casting


【解决方案1】:

如果你想将任意值转换为 TYPE 你可以使用

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

ChangeType 已经有了所有原始数值类型之间的映射,可以相互转换。

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

tuple[0] = default(TYPE);

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-06-30
      • 2013-03-27
      • 2014-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多