条件匹配通用可空数字类型

时间:2011-10-25 10:54:48

标签: c# generics reflection types nullable

给定类型T,有没有办法写出相当于

的东西
if (typeof(T).ImplementsProperty(MaxValue))
{
    return T ?? typeof(T).MaxValue;
}
else
    return T;

请注意,我不需要对类或方法使用泛型类型约束,我只需要在方法体中使用条件。在这种情况下,T可以是任何IComparable。我正在尝试使用最后出现的空值来排序null数字/日期类型。

编辑抱歉,Ray指出上述语法中有错误。它应该返回value ?? typeof(T).MaxValue给定T value或类似的东西。希望这很清楚。

2 个答案:

答案 0 :(得分:2)

对于我来说,这对于可空,值和引用类型似乎很有用:

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;
}

这是你想要的吗?

答案 1 :(得分:1)

首先是一个问题。您不能返回作为类型参数的T.它等同于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)。

where T:class, IComparable最适合的where子句。

另一个选择是将开头的检查更改为

if (value != default(T)) 
    return value

但是传递0会返回MaxValue而不是0,这可能不是你想要的。