给定类型T
,有没有办法写出相当于
if (typeof(T).ImplementsProperty(MaxValue))
{
return T ?? typeof(T).MaxValue;
}
else
return T;
请注意,我不需要对类或方法使用泛型类型约束,我只需要在方法体中使用条件。在这种情况下,T
可以是任何IComparable
。我正在尝试使用最后出现的空值来排序null数字/日期类型。
编辑抱歉,Ray指出上述语法中有错误。它应该返回value ?? typeof(T).MaxValue
给定T value
或类似的东西。希望这很清楚。
答案 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,这可能不是你想要的。