[英]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.