避免数字数据类型的.NET扩展方法?

时间:2012-06-26 13:45:51

标签: c# extension-methods

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

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

2 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:0)

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

IsOdd<Type>()