【发布时间】: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接口?