作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想创建一个执行基本数学运算的通用方法。例如。如果将 double 传递给该函数,它将返回 double。
public static T Multiply<T> (T A, int B)
{
//some calculation here
return (T) A * B;
}
这对我不起作用。
编辑:我收到错误运算符“*”无法应用于类型“T”和“int”的操作数
但是我想知道是否有其他方法可以实现我的目标?
谢谢
最佳答案
您可以通过为特定类型构造和编译 LINQ 表达式来实现,如下所示:
private static IDictionary<Type,object> MultByType = new Dictionary<Type,object>();
public static T Multiply<T>(T a, int b) {
Func<T,int,T> mult;
object tmp;
if (!MultByType.TryGetValue(typeof (T), out tmp)) {
var lhs = Expression.Parameter(typeof(T));
var rhs = Expression.Parameter(typeof(int));
mult = (Func<T,int,T>) Expression.Lambda(
Expression.Multiply(lhs, Expression.Convert(rhs, typeof(T)))
, lhs
, rhs
).Compile();
MultByType.Add(typeof(T), mult);
} else {
mult = (Func<T,int,T>)tmp;
}
return mult(a, b);
}
为避免每次使用时都重新编译表达式,可以将其缓存在字典中。
请注意,这种方法有一定的局限性:
T
与T
的乘法预计会被定义,T
,无需转换。对于小于 int
的类型,情况并非如此,int
的转换。这些都不会在编译时检查。
关于c# 数学运算的泛型方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18875361/
我是一名优秀的程序员,十分优秀!