Clase de base genérica para WinForm UserControl

Creé una clase base genérica para un UserControl de WinForm:

public partial class BaseUserControl : UserControl { public virtual void MyMethod() { // some base stuff here } } 

Y un UserControl basado en eso:

 public partial class MyControl : BaseUserControl { public override void MyMethod() { // some specific stuff here base.MyMethod(); } } 

Funciona bien, pero MyControl no se puede editar en el diseñador de VisualStudio porque dice que no puede cargar la clase base. Traté de definir otra clase BaseUserControl, no genérica, con la esperanza de que la cargara, pero el truco no parece funcionar.

Ya tengo una solución: definir una interfaz, IMyInterface , y luego crear mi control como

 public partial class MyControl : UserControl, IMyInterface 

Pero pierdo mis métodos virtuales básicos (no es un gran problema, pero aún así …).

¿Hay alguna manera de crear una clase genérica básica para un UserControl, con la posibilidad de editarla en el Diseñador de VisualStudio?

Estamos haciendo lo mismo y trabajamos por la especialización de una clase y derivamos de la clase especializada. Usando el código de tu ejemplo, esto significa algo como:

 public partial class UserControl : UserControlDesignable { ... } public class UserControlDesignable : BaseUserControl { } 

El diseñador sigue actuando escamoso a veces, pero la mayoría de las veces funciona.

Tendrás que engañar al diseñador agregando una clase ‘normal’ que hereda de tu formulario básico genérico. Su forma designable debería heredar de esta clase. Las siguientes 2 definiciones de clase están, por lo tanto, en el mismo archivo. Deberá asegurarse de que la clase que hereda del control de usuario base genérico sea la última clase del archivo.

 public MyForm : EditableCustomerForm {} public EditableCustomerForm : GenericForm {} 

El diseñador mostrará la primera clase en el archivo de código que encuentra.

Bueno, esto parece ser un error en Visual Studio.

Al profundizar en el marco (en realidad agregando un RootDesignerSerializer con un tipo personalizado derivado de CodeDomSerializer y reemplazando el método de serialize ), pude probar que el proveedor de código VS Dom está analizando incorrectamente las clases genéricas, y en lugar de considerarlo como una clase genérica lo está considerando como una clase regular con la class nombre class , que Type.GetType() por supuesto no puede encontrar.

Todavía estoy buscando una manera de evitarlo, pero mientras tanto uno puede usar las soluciones anteriores.

Hay un informe de error de Microsoft.Connect, vótelo en https://connect.microsoft.com/VisualStudio/feedback/details/797279/win-forms-designer-error-when-inheriting-from-a- forma genérica

Versión de Visual Studio> = VS2015.1

A partir de VS2015.1 , Windows Forms Designer muestra las clases que tienen una clase base genérica sin ningún problema. Por lo tanto, la solución que se encuentra en otras publicaciones ya no es necesaria para las versiones más recientes de VS y la siguiente clase se mostrará en el diseñador sin ningún problema:

 public class SomeClassControl:GenericControl { } 

Versiones anteriores de Visual Studio

Para versiones anteriores de Visual Studio, use la solución que se describe en otras publicaciones:

 public class SomeClassControl:SomeClassControlBase { } public class SomeClassControlBase:GenericControl{}