2009-08-25 14 views
22

me gustaría definir el siguiente control:C# genéricos Usercontrol

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

El problema es que el diseñador no puede resolver este problema. ¿Hay alguna solución a este problema?

+1

Cuando has probado, ¿cómo la clase se declara en xaml? –

Respuesta

31

Esto funciona

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

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

public class Control3 : Control2 { ... } 

había leído aquí:

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

+2

+1 Prácticamente la misma solución que sugerí, pero se describió más limpiamente. –

+0

sí, funciona y era lo que estaba buscando. – Toto

+0

Asegúrese de tener Control3 en un archivo separado. –

1

Existen algunas restricciones sobre lo que su control puede o no puede hacer para poder usar el diseñador. Fundamentalmente, todos giran alrededor de que el diseñador pueda instanciar su clase (debe tener un constructor sin parámetros, no puede ser abstract, etc.). Debido a que el diseñador no tiene idea de qué tipo pasar como argumento genérico (y dudo que esto sea siquiera una consideración), no se puede crear una instancia de su clase.

Su mejor esperanza sería crear su UserControl y cambiar el constructor a protected (esto, creo, funcionará, ya que el diseñador usa la reflexión e ignora la visibilidad, pero no soy 100% positivo). A continuación, puede heredar de ese UserControl y crear su clase genérica y llamar al constructor base (protected).

0

No creo que esto sea posible, porque el diseñador invoca una instancia de su clase. Si usa genéricos, el diseñador no sabe qué tipo pasar a 'T'.

8

Suena muy parecido a lo que hacemos en nuestro proyecto.

Hay una clase base que es genérico:

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

Luego, para cada uso que definen una versión no genérica (que aún no podría ser utilizado por el diseñador):

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

. .. y controles entonces hemos derivados que podrían ser utilizados en el diseñador:

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

Parece que vas en la dirección opuesta, sin embargo. Tiene una base genérica y está creando implementaciones concretas específicas para el diseñador. Parece que quiere crear un control genérico y diseñarlo. –

+1

Tiene razón, pero usar una clase genérica como control directamente es imposible. Es por eso que lo subclasificamos, por lo que puede ser utilizado en el diseñador. El hecho de que las versiones subclasificadas modifiquen el comportamiento es irrelevante aquí. –

+1

Correcto, es imposible, pero no parece resolver su problema.Esto no es un "truco" que le permitirá sortear el problema. De hecho, parece que la solución va en la dirección OTRA (crear un control que NO ES genérico, hacer el diseño, luego subclasificarlo y hacerlo genérico) tiene más sentido. No veo cómo esto resuelve nada. –

0

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

El error ha sido publicado en el sitio de microsoft y puede ver que está marcado como "Pospuesto", ¡actualmente no hay solución! .

+0

Realmente no parece un "error", es una consecuencia del uso de medicamentos genéricos. Tal vez puedan proporcionar una mejora futura que le permita seleccionar un tipo para ser suministrado, pero yo no lo clasificaría como un "error". –

0

Usa la composición en lugar de los genéricos. En lugar de utilizar ObjectSelectorControl, proporcione un miembro genérico de otro tipo (Selector<T>) y actúe sobre ese objeto en lugar de tratar de forzarse a ser genérico.

+1

Tal vez estoy equivocado, pero si usa la composición dentro de su UserControl: a) Debe especificar el tipo del atributo genérico oc) también debe hacer que su clase sea genérica, así que no entiendo lo que quiere decir. –

+0

La composición no es una técnica de reemplazo para los genéricos. Tal vez se pueda idear una solución para hacer que WinForms trabaje con genéricos, que implique composición, pero en ese caso su respuesta no indica ninguna dirección. – MarioDS