假设我想在.NET中的数字数据类型中添加一个名为 IsOdd()的扩展方法。但是,对于 Int16 , Int32 , Int64 等数据类型,此实现几乎相同,但参数除外正在为扩展方法定义。我真的不喜欢这种冗余,但想知道是否有办法避免它。
有没有更好的方法来解决这个问题?相反,我应该为System.Math实现一个扩展方法,并为 IsOdd()创建重载定义?简而言之,我很好奇是否应该完全避免数字数据类型的扩展方法,因为它们具有固有的冗余性。
答案 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>()