C#数学运算的通用方法

多普勒

我想创建一个执行基本数学运算的通用方法。例如。如果将double传递给函数,它将返回double

public static T Multiply<T> (T A, int B)
{
   //some calculation here
   return (T) A * B; 
}

这对我不起作用。

编辑:我收到一个错误运算符'*'无法应用于类型'T'和'int'的操作数

但是我想知道是否还有其他方法可以实现我想要的目标?

谢谢

谢尔盖·卡里尼琴科(Sergey Kalinichenko)

您可以通过为特定类型构造和编译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);
}

为了避免每次使用表达式时都重新编译,可以将其缓存在字典中。

请注意,这种方法有一定的局限性:

  • 预计将定义Tby的乘法T
  • 乘法的输出预计将T不进行转换。对于小于的类型int情况并非如此。
  • 该类型必须支持从的转换int

编译时不检查所有这些。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章