将泛型类型转换为不可为空的形式

时间:2015-03-16 07:09:18

标签: c#

我有以下方法

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​​需要一个不可为空的类型。我很难将泛型类型转换为非可空类型

4 个答案:

答案 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。