我有以下方法
public ValidationOutput PerformMatch<T>(IEnumerable<T> values, decimal maximum)
values
可以是Int32?
Int64?
或decimal?
。 此方法调用的values
的所有元素将是这些类型之一,但我们不知道它们将提前完成哪些。
我需要检查Values的每个元素是否为null,否则,将它们转换为非可空版本,以便我可以对maximum
进行比较,该decimal
始终为ToList()
。
那就是我if(Math.Abs((Int32)Values[i]-(Int32)Values[i+1])) < maximum)
{
}
值,然后做
{{1}}
我的问题是如何使用泛型类型进行此转换?如果无法完成,那么我唯一的选择是拥有3个几乎重复代码的PerformMatch方法吗?
编辑:我遇到的主要问题是Math.Abs需要一个不可为空的类型。我很难将泛型类型转换为非可空类型
答案 0 :(得分:4)
首先,将Nullable
添加到类型的定义中:
public ValidationOutput PerformMatch<T>(IEnumerable<Nullable<T>> values, decimal maximum)
然后,您可以毫无问题地访问可空性信息。之后,只需使用Convert.ToDecimal
方法获取小数值。
if(Values[i].HasValue)
{
T val = Values[i].Value;
decimal valDec = Convert.ToDecimal(val);
// do whatever.
}
答案 1 :(得分:3)
尝试
public ValidationOutput PerformMatch<T>(IEnumerable<T?> values, decimal maximum)
where T : struct
然后,您可以使用HasValue属性和GetValueOrDefault方法来执行您想要的操作。
答案 2 :(得分:1)
如果您只有三种类型,我建议不要在这里使用泛型:
public ValidationOutput PerformMatch(IEnumerable<Int32?> values, decimal maximum)
{
return PerformMatch(values.Select(i => (decimal?)i), maximum);
}
public ValidationOutput PerformMatch(IEnumerable<Int64?> values, decimal maximum)
{
return PerformMatch(values.Select(i => (decimal?)i), maximum);
}
public ValidationOutput PerformMatch(IEnumerable<decimal?> values, decimal maximum)
{
// your logic here
}
答案 3 :(得分:1)
如果我理解正确,您希望列出非空值的所有项目。
var list = values.Where(x=>x.HasValue).ToList();
HasValue检查item是否有值且不为null。