【发布时间】:2020-03-06 11:04:29
【问题描述】:
有没有办法做类似“string.Compare()”的事情,但对于泛型类型。我想检查一些属性值的范围。
这是我正在做的工作,但它非常难看:
public class SomeClass<T>
{
public T MinValue { get; set; }
public T MaxValue { get; set; }
private T _value;
public T Value
{
get { return _value; }
set
{
_value = value;
// Restrict range to Min/Max
if (Comparer<T>.Default.Compare(MaxValue, value) < 0)
_value = MaxValue;
if (Comparer<T>.Default.Compare(MinValue, value) > 0)
_value = MinValue;
}
}
}
【问题讨论】:
-
不,这对我来说看起来不错。这就是 BCL 的作用(请参阅此处左侧的“参考”列表:source.dot.net/#System.Private.CoreLib/src/System/Collections/…)
-
你所拥有的很好,但如果调用者想要指定自定义比较,则可以添加
IComparer<T>类型的可选构造函数参数。 (如果没有指定,您将回退到使用Comparer<T>.Default就像您已经这样做。) -
你可以在类的顶部引入
private IComparer<T> _comparer = Comparer<T>.Default;,并使SomeClass泛型 -
该类实际上必须已经声明为
public class SomeClass<T>,否则OP中的代码将无法编译。我假设 OP 只是忘记了它。 -
@stackMeUp 如果您使用反射,则处理每个属性,询问它是否具有最小-最大类型的数据注释。 stackoverflow.com/questions/7027613/…