Math.Abs​​(T值)泛型c#

时间:2012-08-05 17:53:05

标签: c# generics math

我想创建泛型函数Math.Abs​​()但我不知道如何制作它。 如果我创建一个类Math,我不能为T值创建方法Abs,因为我不知道T的类型。

如果有人知道该怎么做?

由于

4 个答案:

答案 0 :(得分:8)

六个选项:

  • 根据T
  • 的执行时类型使用反射
  • 对您关心的每种类型使用重载
  • 对您关心的每种类型使用if / else
  • 创建一个Dictionary<Type, Func<object, object>>,其中包含您关注的每种类型的代理
  • 在.NET 4中使用dynamic

    public T Foo<T>(T value)
    {
        dynamic d = value;
        return Math.Abs(d);
    }
    
  • 使用像Marc Gravell generic operators MiscUtil部分

  • 这样的内容

如果可能的话,我可能会选择过载选项。它会在编译时适当地约束你,并避免任何可能耗时的拳击/反射。

答案 1 :(得分:4)

你不能用泛型做到这一点 - 没有通用的类型约束来确保传入的类型是数字类型。

答案 2 :(得分:2)

我认为仅仅是不合逻辑地写一个泛型方法,本质上是表现不同的东西。浮点数和双精度数以类似的方式工作,但int不起作用(它们没有小数部分)。

为每个方法写一个重载应该是处理这个问题的正确方法,否则你最终会做一堆if ifof这基本上是错误的。

答案 3 :(得分:1)

您可以通过T.GetType()获取T的类型。但它不会帮助你。您不能编写泛型方法,但可以为对象编写Abs方法:

private static object Abs(object num)
{
    var type = num.GetType();
    if (type == typeof(Int32))
    {
        return Math.Abs((int) num);
    }
    if (type == typeof(Int64))
        return Math.Abs((long)num);
    if (type == typeof(Int16))
        return Math.Abs((short)num);
    if (type == typeof(float))
        return Math.Abs((float)num);
    if (type == typeof(double))
        return Math.Abs((double)num);
    if (type == typeof(decimal))
        return Math.Abs((decimal)num);
    throw new ArgumentException(string.Format("Abs is not defined for type {0}", type.FullName));
}