簡體   English   中英

匹配通用可為空的數字類型的條件

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

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