Tom*_*han 78 c# generics numeric
我正在尝试在数字类型上编写一个扩展方法,以便在我正在构建的流畅测试框架中使用.基本上,我想这样做:
public static ShouldBeGreaterThan<T>(this T actual, T expected, string message)
where T : int || T: double || etc...
Run Code Online (Sandbox Code Playgroud)
只是where T : struct
不这样做,因为这也将匹配string
和bool
,可能别的东西,我忘了.有什么我可以做的只匹配数字类型?(实现的具体类型>
和<
运营商,这样我就可以对它们进行比较.如果这意味着我匹配日期为好,它其实并不重要-扩展仍然会做我的期望.)
flq*_*flq 56
在这种情况下,您希望将泛型约束到IComparable
接口,这使您可以访问该CompareTo
方法,因为此接口允许您回答该问题ShouldBeGreaterThan
.
数字类型将实现该接口,并且它也适用于字符串的事实不应该打扰你那么多.
Mar*_*k H 44
where T : struct,
IComparable,
IComparable<T>,
IConvertible,
IEquatable<T>,
IFormattable
Run Code Online (Sandbox Code Playgroud)
这是我能接近数字约束的最接近的.所有数字类型都实现了这5个接口,但是boor没有实现IFormattable,并且字符串是引用类型,所以它们不适用.
还有一些其他的东西可以实现这些 - 例如DateTime,所以它并不是真正需要的,但是会阻止很多你不想要的实例化.
Lee*_*Lee 16
public static bool IsGreaterThan<T>(this T actual, T comp) where T : IComparable<T>
{
return actual.CompareTo(comp) > 0;
}
Run Code Online (Sandbox Code Playgroud)
如果需要,也可以添加结构约束.
很难仅限于数字,因为没有什么常见的INumeric
用作过滤器.实际上,我怀疑这里最简单的方法是不要坚持约束,并Comparer<T>.Default.Compare
在方法中使用.
这种内置类型支持泛型IComparable<T>
和非泛型IComparable
,并支持ref类型,值类型和通过提升使用Nullable<T>
.
对于全运营商的使用,看看MiscUtil的Operator
类和GreaterThan
等,如果你这可能是有用真的想使用运营商(而不是接口).它还提供对其他运营商的访问等Add
.