我有一个通用类型T.使用Marc的Operator课程,我可以对它进行计算.
也许有更好的解决方案?我更愿意支持任何可能的类型,所以我想防止硬编码哪些类型是整数/非整数.
背景信息
我发现自己的情况是我想要转换double为T但是舍入到最接近值T的double值.
int a = (int)2.6导致2我希望它导致它3,而不知道类型(在这种情况下int).也可能是double,在这种情况下,我希望结果如此2.6.
你试过Convert.ChangeType吗?就像是:
Convert.ChangeType(1.9d, typeof (T))
Run Code Online (Sandbox Code Playgroud)
它适用于我认为的所有数字类型(只要第一个参数是iConvertible,类型是支持的,所有基本数字应该是我相信的).
重要的是要提到这将调用像double.ToInt32这样的方法来舍入值而不是截断(我相信银行家四舍五入).
我在一个小的LinqPad程序中测试了它,它做了我认为你想要的:
void Main()
{
var foo = RetNum<decimal>();
foo.Dump();
}
public static T RetNum<T>()
{
return (T)Convert.ChangeType(1.9d, typeof (T));
}
Run Code Online (Sandbox Code Playgroud)
我不是 100% 确定你在问什么,但是:
要检查它是否是整型,请使用:if (obj is float || obj is double),或if typeof(T) == typeof(float) || typeof(T) == typeof(double))
要检查它是否是整数值,请将其转换为双精度值,然后执行if(value == Math.Round(value))
当然,这是假设您首先有一个数字。我相信您使用的 Operator 类支持 DateTime 等内容。让您的通用方法具有通用约束会更好吗where T : IConvertible?这样就有了明确的ToDouble方法ToInteger。
编辑:
我想我明白:你有两个局部变量,double d; T num;. 您想要强制转换d为 type T,但要适当舍入 ifT是整型。那是对的吗?
假设这是正确的,这就是我要做的:
public void SomeMethod<T>()
{
double d;
// I think I got all the floating-point types. There's only a few, so we can test for them explicitly.
if(typeof(T) != typeof(double) && typeof(T) != typeof(float) && typeof(T) != typeof(Decimal))
{
d = Math.Round(d);
}
T converted = Convert.ChangeType(d, typeof(T));
}
Run Code Online (Sandbox Code Playgroud)