我有一个名为 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 之类的东西转换回原始泛型类型。
我该如何进行这项工作?
如果性能不是一个大问题,并且您想避免进行大切换,您可以通过反射来实现(并尝试/捕获)
public TValue GetMaxNumber()
{
try
{
return (TValue)typeof(TValue).GetField("MaxValue").GetValue(null);
}
catch
{
throw new InvalidOperationException($"Unsupported type {typeof(TValue)}");
}
}
您可以这样转换:
return (TValue)(object)int.MaxValue;
装箱允许对相关泛型类型参数进行拆箱。
如果您的泛型类型实现了 IBinaryNumber 接口,您可以使用 TValue.AllBitsSet 轻松获取最大值。设置方法如下:
<TValue> where TValue : IBinaryNumber<TValue>
这样就可以访问AllBitsSet获取最大值了
未测试,但可能是 Convert.ChangeType:
var conversionType = typeof(TValue);
return (TValue)Convert.ChangeType(int.MaxValue, conversionType);