如何在c#中获取通用数字类型的最大值和最小值

问题描述 投票:0回答:4

我有一个名为 TValue 的泛型类型。 我想做这样的事情:


public TValue Number {get;set;}
public TValue GetMaxNumber()
{
   switch (Number)
   {
       case int @int:
           if (@int == default(int))
           {
               return int.MaxValue;
           }
       case long @long:
           //get max value of long
       case short @short:
           //get max value of short
       case float @float:
           //get max value of float
       case double @double:
           //get max value of double
       case decimal @decimal:
           //get max value of decimal
       default:
           throw new InvalidOperationException($"Unsupported type {Number.GetType()}");
    }
}

我希望 GetMaxNumber 方法返回该数字类型的最大可能值。如果不是数字类型则抛出异常。

我在这里遇到的主要问题是,我不明白如何在使用 int 的属性(例如 MaxValue)时将 int 之类的东西转换回原始泛型类型。

我该如何进行这项工作?

c# generics
4个回答
3
投票

如果性能不是一个大问题,并且您想避免进行大切换,您可以通过反射来实现(并尝试/捕获)

public TValue GetMaxNumber()
{
    try
    {
        return (TValue)typeof(TValue).GetField("MaxValue").GetValue(null);
    }
    catch
    {
        throw new InvalidOperationException($"Unsupported type {typeof(TValue)}");
    }
}

1
投票

您可以这样转换:

return (TValue)(object)int.MaxValue;

装箱允许对相关泛型类型参数进行拆箱。


0
投票

如果您的泛型类型实现了 IBinaryNumber 接口,您可以使用 TValue.AllBitsSet 轻松获取最大值。设置方法如下:

<TValue> where TValue : IBinaryNumber<TValue>

这样就可以访问AllBitsSet获取最大值了


-1
投票

未测试,但可能是 Convert.ChangeType:

var conversionType = typeof(TValue);
return (TValue)Convert.ChangeType(int.MaxValue, conversionType);
© www.soinside.com 2019 - 2024. All rights reserved.