2009-08-25 12 views

cevap

31

Bu

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

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

public class Control3 : Control2 { ... } 

çalışır buradan okumuştu: Bunu çalıştığımızda

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

+2

+1 Pratikte önerdiğim gibi aynı çözüm, ancak daha temiz bir şekilde tarif edildi. –

+0

evet işe yarıyor ve aradığım şey buydu. – Toto

+0

Control3'ün ayrı bir dosyada bulunduğundan emin olun. –

1

kontrol veya tasarımcı kullanabilmek için için yapamayacağı konularla ilgili bazı kısıtlamalar vardır. Temel olarak hepsi, tasarımcıyı sınıfınızı oluşturabilmenin etrafında döner (parametresiz bir kurucu olmalı, abstract, vb olamaz). Tasarımcı ne tür bir genel argüman olarak geçeceğine dair bir fikre sahip olmadığı için (ve bunun bir düşünceden ibaret olduğunu sanmıyorum), sınıfınız örneklenemez.

En iyi umudu, UserControl'nu oluşturmak ve kurucuyu protected olarak değiştirmek olacaktır (bu, tasarımcının yansıma kullandığı ve görünmezliği göz ardı ettiği için çalışacağına inanıyorum, ancak% 100 pozitif değilim). Daha sonra bu UserControl'dan devralınabilir ve genel sınıfınızı oluşturabilir ve taban (protected) yapıcısını çağırabilirsiniz. Tasarımcı senin sınıfının bir örneğini çağırır çünkü bu inanmıyorum

0

mümkündür. Jenerik kullanıyorsanız, tasarımcı 'T' ye hangi türden geçeceğini bilmez.

8

Projemizde yaptığımıza çok benziyor.

jenerik olan bir temel sınıf vardır:

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

:

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

Daha sonra her kullanım için biz (hala tasarımcı tarafından kullanılamadı) olmayan bir jenerik sürümü tanımlamak

. .. ve tasarımcı kullanılabilecek o zaman elde var kontrolleri:

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

Görünüşe göre tersi yönde gidiyorsunuz. Genel bir tabana sahipsiniz ve tasarımcı için belirli somut uygulamalar yaratıyorsunuz. Genel bir kontrol oluşturmak ve tasarlamak istiyor gibi görünüyor. –

+1

Haklısınız, ancak doğrudan kontrol olarak genel bir sınıf kullanmak imkansızdır. Bu yüzden onu alt sınıf olarak kullanıyoruz, bu yüzden tasarımcıda kullanılabilir. Alt sınıflanmış sürümlerin davranışı değiştirmesi gerçeği bu konuyla ilgisizdir. –

+1

Doğru, bu imkansız, ancak problemini çözmek için görünmüyor.Bu, onun problemi çözmesine izin verecek bir "hack" değil. Gerçekten de, çözümün DİĞER yöne doğru gittiği anlaşılıyor (ISN'T jenerik, tasarımı yap, sonra altsınıfı yap ve bunu jenerik yapan bir kontrol yarat.) Daha mantıklı. Bunun bir şeyi nasıl çözdüğünü anlamıyorum. –

0

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

hata microsoft'un siteye gönderilen edildi ve ücreti "Ertelendi" olarak işaretlenmiş anda çözüm yok onun görebiliriz !! .

+0

Gerçekten bir "hata" gibi görünmüyor, bu jenerik kullanmanın bir sonucudur. Belki de, tedarik edilecek bir türü seçmenize izin veren gelecekteki bir geliştirme sağlayabilirler, ancak bunu bir "hata" olarak sınıflandırmayacağım. –

0

Jenerikler yerine kompozisyon kullanın. ObjectSelectorControl kullanmak yerine, jenerik olmaya zorlamak yerine başka bir tür (Selector<T> belki) genel bir üye verin ve bu nesne üzerinde harekete geçin.

+1

Belki hatalıyım, ancak UserControl'unuzda kompozisyon kullanıyorsanız: a) Genel nitelik tipini belirtmeniz gerekir veya b) size sınıf jenerik yapmalısınız, böylece ne demek istediğimi anlamadım. –

+0

Kompozisyon, jenerikler için bir yedek teknik değildir. Belki de WinForms'u jeneriklerle birlikte çalıştırabilmek için bir çözüm üretilebilir, ancak bu durumda cevabınız herhangi bir yön göstermez. – MarioDS

İlgili konular