[英]Conditional for matching generic nullable numeric types
給定類型T
,有什么辦法可以寫出相當於
if (typeof(T).ImplementsProperty(MaxValue))
{
return T ?? typeof(T).MaxValue;
}
else
return T;
請注意,我不需要類或方法的通用類型約束,而只需要方法主體中的條件即可。 在這種情況下, T
可以是任何IComparable
。 我正在嘗試獲取空數字/日期類型,以便最后一次出現空值。
編輯:很抱歉,雷指出的上述語法有誤。 應該是返回value ?? typeof(T).MaxValue
value ?? typeof(T).MaxValue
給定一個T value
或類似的T value
。 希望那很清楚。
這似乎對我為空,值和引用類型有效:
public T GetSelfOrMaxValue<T>(T value)
{
var t = Nullable.GetUnderlyingType(typeof(T)) ?? typeof(T);
var fi = t.GetField("MaxValue");
if (fi != null && fi.IsStatic && fi.FieldType.Equals(t))
{
return (T)fi.GetValue(null);
}
return value;
}
這就是你想要的嗎?
首先是一個問題。 您不能返回T(它是類型參數)。 等效於return int
無效的return int
。
但是您可以看到T是否具有MaxValue
屬性,如果有,則調用它。 下面的代碼檢查名為MaxValue
的靜態屬性並將其調用(並假定它是一個int)。
Type type = typeof (T);
var propInfo = type.GetProperty("MaxValue", BindingFlags.Static | BindingFlags.Public);
if (propInfo != null)
return (int)propInfo.GetValue(null, null);
我假設您想要這樣的東西:
public static T GetValueOrMax<T>(T value) where T:IComparable
{
if (value != null)
return value;
Type type = typeof (T);
var propInfo = type.GetProperty("MaxValue", BindingFlags.Static | BindingFlags.Public);
if (propInfo != null)
return (T)propInfo.GetValue(null, null);
return value;
}
但這會有它自己的問題,如果您傳遞一個int,它將永遠不會為null,並且將始終返回value
。 如果您傳入一個可為null的int,則它將不會實現MaxValue(實際上您無法傳遞可為null的int,因為它未實現IComparable)。
T:class, IComparable
where子句可能是最合適的。
另一種選擇是在開始時將支票更改為
if (value != default(T))
return value
但是,然后傳遞0將返回MaxValue而不是0,這可能不是您想要的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.