Ten en cuenta que en las ciencias un problema casi siempre tiene varias resoluciones, no obstante nosotros aquí te enseñamos la mejor y más óptimo.
Solución:
No he visto el contenido en urban potato (está abajo), pero a mí y a Smelch se nos ocurrió una solución. Form
hereda de una clase abstracta, por lo que lo que no te dicen es que es solo el primer nivel de herencia que no puede ser abstracto, el segundo hacia abajo puede.
A partir de ahí, es simplemente una cuestión de tener una clase vacía en el medio y envolver una #if debug
alrededor de la declaración de formularios y listo. Solo asegúrese de lanzar en modo de lanzamiento y diseñar en modo de depuración (que es muy típico).
Obtendrá soporte completo del diseñador y una clase base abstracta real en el momento del diseño (depuración) y compilación (lanzamiento) porque cada vez que termina usando su clase base abstracta.
La explicación completa y la respuesta está aquí.
Puedes resolver esto usando un attribute en su clase abstracta como la siguiente
[TypeDescriptionProvider(typeof(AbstractControlDescriptionProvider))]
Esto funcionará para todos los casos en los que lo necesite. El AbstractControlDescriptionProvider está debajo
public class AbstractControlDescriptionProvider : TypeDescriptionProvider
public AbstractControlDescriptionProvider()
: base(TypeDescriptor.GetProvider(typeof(TAbstract)))
public override Type GetReflectionType(Type objectType, object instance)
if (objectType == typeof(TAbstract))
return typeof(TBase);
return base.GetReflectionType(objectType, instance);
public override object CreateInstance(IServiceProvider provider, Type objectType, Type[] argTypes, object[] args)
if (objectType == typeof(TAbstract))
objectType = typeof(TBase);
return base.CreateInstance(provider, objectType, argTypes, args);