2012-06-26 28 views
7

Giả sử tôi muốn thêm phương thức tiện ích được gọi là IsOdd() vào các kiểu dữ liệu số trong .NET. Tuy nhiên, việc thực hiện điều này sẽ hầu như giống nhau đối với các kiểu dữ liệu như Int16, Int32, Int64, v.v., ngoại trừ tham số được xác định cho phương pháp mở rộng. Tôi thực sự không thích dự phòng này nhưng tự hỏi nếu không có cách nào để tránh nó.Tránh phương pháp mở rộng .NET cho các kiểu dữ liệu số?

Có cách nào tốt hơn để xử lý việc này không? Thay vào đó, tôi có nên thực hiện một phương pháp mở rộng cho System.Math và tạo các định nghĩa quá tải cho IsOdd()? Trong ngắn hạn, tôi tò mò nếu phương pháp mở rộng cho các kiểu dữ liệu số nói chung nên tránh hoàn toàn, do dư thừa cố hữu của họ.

+1

Vâng, tôi muốn tránh đặt một phương pháp mở rộng về những loại đơn giản chỉ vì chúng được sử dụng để phổ biến, một tôi sẽ không cần 'IsOdd' tất cả những gì thường xuyên. Nó sẽ làm chúng lộn xộn. – Servy

+2

... để thêm vào nhận xét của Servy, nó thường được coi là thực hành xấu để thêm các phương pháp mở rộng cho các loại rất chung chung như struct & object. Thay vào đó, chỉ cần tạo một lớp tĩnh và thử nghiệm với 'MyMath.IsOdd (x)' –

Trả lời

7

Bạn không thể tạo phương thức mở rộng cho lớp tĩnh. Gần nhất bạn có thể làm, như sau:

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

Điều này sẽ hạn chế phương pháp mở rộng thành loại giá trị. Tuy nhiên, bạn vẫn sẽ nhận được một số nội dung bạn không thể xử lý (ví dụ: DateTime chẳng hạn). Bạn sẽ phải ném một ngoại lệ trong trường hợp này.

Edit: Như Mangist nói trong các ý kiến, bạn có thể làm như sau để hạn chế hơn nữa phương pháp:

public static bool IsOdd<T>(this T number) 
    where T : struct, IComparable, IComparable<T>, 
       IConvertible, IEquatable<T>, IFormattable 
+1

Vì vậy, bạn muốn làm lộn xộn intellisense cho mỗi cấu trúc được nạp trong assembly của bạn. Nghe có vẻ rắc rối hơn nó có giá trị tại thời điểm đó. – Servy

+5

Bạn có thể hạn chế nó xuống thấp hơn nữa bằng cách thêm nơi T: struct, IComparable, IComparable , IConvertible, IEquatable , IFormattable – Mangist

+0

Tốt nhất, Mangist. – GregRos

0

Bạn luôn có thể kết hợp Generics với phương pháp khuyến nông để tránh sự trùng lặp, như trong trường hợp bạn đề cập. ví dụ

IsOdd<Type>()

Các vấn đề liên quan