将generics参数转换为整数和从整数转换

我想编写generics类,它用于内置类型,如byteushort 。 在内部计算中,我需要将generics类型转换为整数并返回generics类型。 我找到了编译此类代码的方法,例如:

 class Test where T : struct, IConvertible { public static T TestFunction(T x) { int n = Convert.ToInt32(x); T result = (T)Convert.ChangeType(n, typeof(T)); return result; } } 

我认为如果将它们用于计算循环中,使用此类转换可能会显着降低性能。 有没有更好的方法来进行这些转换?

intT转换有点棘手。 我想你可以在这里使用Expression类。

Test类应该看起来像这样:

 class Test where T : struct, IConvertible { private static Func _getInt; static Test() { var param = Expression.Parameter(typeof(int), "x"); UnaryExpression body = Expression.Convert(param, typeof(T)); _getInt = Expression.Lambda>(body, param).Compile(); } public static T TestFunction(T x) { int n = Convert.ToInt32(x); T result = _getInt(n); return result; } } 

它在静态构造函数中为您准备_getInt = x => (T)x并稍后使用它将int转换为T

经过一番思考,我很高兴,由于这个问题和一些答案,我已经解决了我的一个老问题:在通用T上使用操作:

首先使用Cast的示例(根据OP的要求)

 public static class Cast { public static readonly Func Do; static Cast() { var par1 = Expression.Parameter(typeof(T)); Do = Expression.Lambda>(Expression.Convert(par1, typeof(U)), par1).Compile(); } } 

然后是乘法的例子:

 public static class Multiply { public static readonly Func Do; static Multiply() { var par1 = Expression.Parameter(typeof(T)); var par2 = Expression.Parameter(typeof(T)); Do = Expression.Lambda>(Expression.Multiply(par1, par2), par1, par2).Compile(); } } 

用法很简单:

 int x = Conv.Do(someTValue); 

最后创建一个静态类,其中一个字段是一个名为Do的只读静态属性,它是一个委托,它“指向”使用表达式树构建的操作。

乘法类似:

 T res = Multiply.Do(someTValue1, someTValue2); 

在一般情况下,乘法比直接乘法慢一些(在发布模式下,没有调试)。

从乘法开始,显然可以轻松完成其他操作

(有趣的是我对Expression树很了解,但我从未想过使用静态类作为“字典”来包含各种类型。我总是做类似Dictionary东西Dictionary而不是让.NET通过generics类专业化“处理” Dictionary 。)