簡體   English   中英

將泛型類型轉換為非空形式

[英]Casting generic type to its non-nullable form

我有以下方法

public ValidationOutput PerformMatch<T>(IEnumerable<T> values, decimal maximum)

values可以是Int32? Int64? 還是decimal? 調用此方法的所有 values元素都將是這些類型之一,但是我們不知道它們將全部提前。

我需要檢查Values的每個元素是否為null,如果不是,請將其強制轉換為非可空版本,以便隨后可以對始終為decimal maximum進行比較。

那就是我將ToList()值,然后做類似的事情

if(Math.Abs((Int32)Values[i]-(Int32)Values[i+1])) < maximum)
{
}

我的問題是如何使用泛型類型進行轉換? 如果無法完成,那么我唯一的選擇就是擁有3個幾乎重復代碼的PerformMatch方法?

編輯:我的主要問題是Math.Abs​​需要非空類型。 我很難將通用類型轉換為非空類型

首先,將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.
}

嘗試

public ValidationOutput PerformMatch<T>(IEnumerable<T?> values, decimal maximum)
where T : struct

然后,您可以使用HasValue屬性和GetValueOrDefault方法執行所需的操作。

如果只有三種類型,建議不要在此處使用泛型:

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
}

如果我理解正確,那么您希望列出不為null的值中的所有項目。

var list = values.Where(x=>x.HasValue).ToList();    

HasValue檢查item是否具有值並且不為null。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM