我想创建泛型函数Math.Abs()但我不知道如何制作它。 如果我创建一个类Math,我不能为T值创建方法Abs,因为我不知道T的类型。
如果有人知道该怎么做?
由于
答案 0 :(得分:8)
六个选项:
T
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));
}