给定类型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,这可能不是你想要的。