9

假设我想向.NET 中的数字数据类型添加一个名为IsOdd()的扩展方法。然而,除了为扩展方法定义的参数外,对于Int16Int32Int64等数据类型的实现几乎相同。我真的不喜欢这种冗余,但想知道是否没有办法避免它。

有没有更好的方法来处理这个?例如,我是否应该为 System.Math 实现扩展方法并为IsOdd()创建重载定义?简而言之,我很好奇数字数据类型的扩展方法是否应该完全避免,因为它们固有的冗余。

4

2 回答 2

8

您不能为静态类创建扩展方法。您可以做的最接近的是:

public static bool IsOdd<T>(this T number) where T : struct

这会将扩展方法限制为值类型。但是,您仍然会得到一些您无法处理的东西(DateTime例如)。在这种情况下,您必须抛出异常。

编辑:正如 Mangist 在评论中所说,您可以执行以下操作以进一步限制该方法:

 public static bool IsOdd<T>(this T number) 
     where T : struct, IComparable, IComparable<T>, 
               IConvertible, IEquatable<T>, IFormattable
于 2012-06-26T13:49:08.563 回答
0

您始终可以Generics与扩展方法结合使用以避免重复,就像您提到的情况一样。例如

IsOdd<Type>()

于 2012-06-26T13:49:54.140 回答