Generic base class for WinForm UserControl
Well this appears to be a bug in Visual studio.
By digging into the framework (actually by adding a RootDesignerSerializer
with a custom type derived from CodeDomSerializer
and overriding the serialize
method), I was able to prove that the VS Code Dom provider is actually parsing wrong the generic classes, and instead of considering it as a generic class it is considering it as a regular class with the name class<T>
, which Type.GetType()
can of course not find.
I am still searching for a way to work around it, but in the mean time one can use the solutions above.
There is a Microsoft.Connect bug report on it, please vote on it at https://connect.microsoft.com/VisualStudio/feedback/details/797279/win-forms-designer-error-when-inheriting-from-a-generic-form
We're doing the same thing and we work around by specializing a class first and derive from the specialized class. Using the code from your example this means something like:
public partial class UserControl : UserControlDesignable
{
...
}
public class UserControlDesignable : BaseUserControl<Someclass> { }
The designer is still acting flaky sometimes - but most of the time it works.
You'll have to trick the designer by adding a 'regular' class that inherits from your generic base form. Your designable form should then inherit from this class. The following 2 class definitions are thus in the same file. You'll have to make sure that the class that inherits from the generic base user-control, is the last class in the file.
public MyForm : EditableCustomerForm
{}
public EditableCustomerForm : GenericForm<Customer>
{}
The designer will display the first class in the code file that it encounters.