假设我想向.NET 中的数字数据类型添加一个名为IsOdd()的扩展方法。然而,除了为扩展方法定义的参数外,对于Int16、Int32、Int64等数据类型的实现几乎相同。我真的不喜欢这种冗余,但想知道是否没有办法避免它。
有没有更好的方法来处理这个?例如,我是否应该为 System.Math 实现扩展方法并为IsOdd()创建重载定义?简而言之,我很好奇数字数据类型的扩展方法是否应该完全避免,因为它们固有的冗余。
假设我想向.NET 中的数字数据类型添加一个名为IsOdd()的扩展方法。然而,除了为扩展方法定义的参数外,对于Int16、Int32、Int64等数据类型的实现几乎相同。我真的不喜欢这种冗余,但想知道是否没有办法避免它。
有没有更好的方法来处理这个?例如,我是否应该为 System.Math 实现扩展方法并为IsOdd()创建重载定义?简而言之,我很好奇数字数据类型的扩展方法是否应该完全避免,因为它们固有的冗余。
您不能为静态类创建扩展方法。您可以做的最接近的是:
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
您始终可以Generics
与扩展方法结合使用以避免重复,就像您提到的情况一样。例如
IsOdd<Type>()