2009-08-25 34 views
22

Tôi muốn xác định sự kiểm soát sau:C# Generics UserControl

public partial class ObjectSelectorControl<T> : UserControl where T : class 

Vấn đề là các nhà thiết kế không thể giải quyết này. Có cách nào giải quyết vấn đề này không?

+1

Khi bạn đã thử nó, làm thế nào bạn khai báo các lớp trên XAML? –

Trả lời

31

này hoạt động

public class Control1<T> : UserControl { ... } 

public class Control2 : Control1<double> { ... } 

public class Control3 : Control2 { ... } 

đã đọc nó ở đây:

http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/0c265543-d6f0-41f6-beeb-b89e0071c5c3

+2

+1 Thực tế là giải pháp tương tự như tôi đã đề xuất, nhưng được mô tả rõ ràng hơn. –

+0

yep nó hoạt động và đó là những gì tôi đang tìm kiếm. – Toto

+0

Đảm bảo có Control3 trong một tệp riêng biệt. –

1

Có một số hạn chế về những gì kiểm soát của bạn có thể hoặc không thể thực hiện để có thể sử dụng nhà thiết kế. Về cơ bản, tất cả đều xoay quanh nhà thiết kế có khả năng khởi tạo lớp của bạn (phải có một hàm tạo không tham số, không thể là abstract, v.v.). Bởi vì nhà thiết kế không có ý tưởng loại nào để vượt qua như một đối số chung (và tôi nghi ngờ điều này thậm chí là một sự cân nhắc), lớp của bạn không thể được khởi tạo.

hy vọng tốt nhất của bạn sẽ được tạo UserControl bạn và thay đổi các nhà xây dựng để protected (điều này, tôi tin rằng, sẽ làm việc, kể từ khi nhà thiết kế sử dụng phản xạ và bỏ qua tầm nhìn, nhưng tôi không phải là 100% dương tính). Sau đó, bạn có thể kế thừa từ đó UserControl và tạo lớp chung của mình và gọi hàm tạo cơ sở (protected).

0

Tôi không tin điều này là có thể, bởi vì nhà thiết kế gọi một thể hiện của lớp học của bạn. Nếu bạn sử dụng generics, nhà thiết kế không biết loại nào sẽ chuyển vào 'T'.

8

Nghe có vẻ giống như những gì chúng tôi làm trong dự án của mình.

Có một lớp cơ sở mà là chung chung:

public partial class controlItemList<TBaseItem, TBaseItemCollection> : UserControl, IUIDispatcher 
    where TBaseItem : new() 
    where TBaseItemCollection : IItemCollection<TBaseItem> 

Sau đó cho mỗi lần sử dụng chúng ta định nghĩa một phiên bản không-generic (mà vẫn không thể được sử dụng bởi nhà thiết kế):

public class controlMessagesNonGenericParent : controlItemList<MailItem, MailItemCollection> 
{ 
} 

. .. và sau đó chúng tôi có các điều khiển dẫn xuất có thể được sử dụng trong thiết kế:

public partial class controlMessages : controlMessagesNonGenericParent 
{ 
... 
} 
+1

Dường như bạn đang đi theo hướng ngược lại. Bạn có một cơ sở chung và bạn đang tạo các triển khai cụ thể cụ thể cho nhà thiết kế. Có vẻ như anh ta muốn tạo ra một điều khiển chung và thiết kế nó. –

+1

Bạn nói đúng, nhưng việc sử dụng một lớp chung là điều khiển trực tiếp là không thể. Đó là lý do tại sao chúng tôi phân lớp nó, vì vậy nó có thể được sử dụng trong nhà thiết kế. Thực tế là các phiên bản subclassed sửa đổi hành vi là không thích hợp ở đây. –

+1

Phải, không thể, nhưng dường như không giải quyết được vấn đề của anh ta.Đây không phải là một "hack" mà sẽ cho phép anh ta để có được xung quanh vấn đề. Thật vậy, có vẻ như giải pháp đi theo hướng KHÁC (tạo ra một điều khiển ISN'T chung chung, làm thiết kế, sau đó phân lớp nó và làm cho nó chung chung) có ý nghĩa hơn. Tôi không thấy cách này giải quyết bất cứ điều gì. –

0

https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=105876

Lỗi đã được đăng lên trang web của microsoft và bạn có thể thấy rằng lỗi của nó được đánh dấu là "Đã hoãn" hiện không có giải pháp !! .

+0

Không thực sự có vẻ giống như một "lỗi", đó là hậu quả của việc sử dụng Generics. Có lẽ họ có thể cung cấp một nâng cao trong tương lai cho phép bạn chọn một loại được cung cấp, nhưng tôi sẽ không phân loại nó như là một "lỗi". –

0

Sử dụng chế phẩm thay cho thuốc generic. Thay vì sử dụng ObjectSelectorControl, cung cấp cho một thành viên chung loại khác (Selector<T> có thể) và hành động trên đối tượng đó thay vì cố ép buộc bản thân là chung chung.

+1

Có lẽ tôi sai nhưng nếu bạn sử dụng bố cục bên trong UserControl của bạn: a) Bạn phải chỉ định loại thuộc tính chung hoặc b) bạn phải biến bạn thành lớp chung vì vậy tôi không hiểu ý bạn là gì. –

+0

Thành phần không phải là kỹ thuật thay thế cho thuốc generic. Có lẽ một giải pháp để làm cho WinForms làm việc với Generics có thể được đưa ra, liên quan đến thành phần, nhưng trong trường hợp đó câu trả lời của bạn không chỉ ra bất kỳ hướng nào. – MarioDS