2010-06-29 22 views
6
List<T> Foo<T>(Ilist list) 
where T : ?? 

có cách nào để thực thi T là
một trong số ít các lớp không?trong đó t: nhiều lớp

cuối cùng tôi muốn thực hiện chuyển đổi trên T ..

cảm ơn.

+0

Là những 'vài classes' có liên quan hoặc làm họ chia sẻ một lớp cơ sở chung hoặc giao diện mà tất cả chúng thực hiện? –

+3

Chỉ cần lưu ý rằng đôi khi bạn có thể đi quá xa với Generics. Tôi đã làm việc trên một cái gì đó gần đây và có một cấu trúc chung phức tạp, nơi tôi có ClassA nơi P , S . Đó là tất cả tốt đẹp và chung chung, nhưng cuối cùng đã được thiết kế và tôi không thể sử dụng nó một cách hiệu quả. Thay vào đó, tôi đã phải chia mã 3 cách và chấp nhận lặp lại mã tương tự trong các lớp khác nhau. – Ian

+9

Dưới đây là một quy tắc nhanh của ngón tay cái - nếu bạn nghĩ đến việc thực hiện 'chuyển' trên' T', hoặc thậm chí kiểm tra nó bằng 'if', bạn đang làm sai. Hãy lùi lại một bước và tìm ra cách. – Kobi

Trả lời

9

Việc thực thi ràng buộc kiểu theo cách này cho thấy rằng một số lớp có liên quan với chức năng chung.

Bạn nên thực hiện một giao diện phổ biến và sau đó hạn chế các loại để Interface rằng:

public interface IUseful 
{ 
    public void UsefulMethod(); 
} 

List<T> Foo<T>(IList list) where T : IUseful 
{ 
    // You now have access to all common functionality defined in IUseful 
} 

Lợi ích bổ sung là bây giờ bạn không cần phải bật T để thực hiện hành vi khác nhau. Bạn có thể để con cái của IUseful thực hiện hành vi của riêng chúng và sau đó tự gọi chúng.

+0

Tôi đã tìm kiếm một cái gì đó tương tự. Tôi đồng ý một giao diện chung là giải pháp tốt nhất. Mặc dù hiện tại tôi đang sử dụng hai thư viện và tôi không thể thay đổi mã của mình để sử dụng giao diện chung. Vì vậy, có một cách để làm điều này mà không có một giao diện? –

6

Trong trường hợp này, T có thể là một lớp cơ sở chung hoặc giao diện mà bạn liệt kê các đối tượng chia sẻ. Bạn có thể có List<IFoo> và danh sách có thể chứa các lớp Foo, Bar, and Baz nếu chúng từng thực hiện giao diện IFoo. Ngắn của việc sử dụng thừa kế, bạn sẽ bị mắc kẹt với một danh sách các đối tượng.

15

Bạn có thể yêu cầu mỗi lớp bạn muốn cho phép vào danh sách của bạn triển khai một số giao diện ISomething và sau đó tạo List<ISomething>.

cuối cùng tôi muốn làm một công tắc trên T ..

Thay vì một switch vào loại đối tượng nó có thể là tốt hơn để có một phương pháp trong giao diện của bạn và thực hiện nó khác nhau cho mỗi lớp học.

+0

+1 cho nhận xét về việc không bật loại. – Ian

+0

+1 Đây là những gì tôi đã đăng. –

1

Theo như tôi biết, điều này là không thể. Tôi khuyên bạn nên bắt đầu tập hợp các lớp có giới hạn của bạn từ một lớp hoặc giao diện cơ sở chung.

2

Bạn muốn gì? Sau dấu hai chấm, bạn có thể liệt kê các loại mà bạn ràng buộc T.

Đối với nhiều lớp, có thể triển khai một giao diện chung và đặt ràng buộc của bạn thành giao diện có thể thực hiện thủ thuật.

Hãy nhìn vào liên kết này để biết thêm chi tiết: Constraints on Type Parameters (C# Programming Guide)

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