条件用于匹配泛型可空数值类型



给定类型T,是否有办法写出与

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

注意,我不需要类或方法上的泛型类型约束,我只需要方法体中的条件。这里的T可以是任意的IComparable。我试图得到null数字/日期类型排序与空发生最后。

Edit:抱歉,Ray指出了上面的语法错误。它应该返回value ?? typeof(T).MaxValue给定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

但是你可以看到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,它永远不会是空的,它总是返回value。如果你传递一个可空的int,那么它不会实现MaxValue(实际上你不能传递一个可空的int,因为它不实现IComparable)。

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新