Search code examples
c#.netwinformsgenericsdesigner

Fix embedded resources for a generic UserControl


During a refactoring, I added a generic type parameter to MyControl, a class derived from UserControl. So my class is now MyControl<T>.

Now I get an error at runtime stating that the embedded resource file MyControl`1.resources cannot be found. A quick look with .NET Reflector shows that the resource file is actually called MyControl.resources, without the `1.

At the start of the MyControl<T>.InitializeComponent method there is this line which is probably the one causing problems:

 System.ComponentModel.ComponentResourceManager resources =
    new System.ComponentModel.ComponentResourceManager(
       typeof(MyControl<>));

How do I force the ComponentResourceManager to use the embedded resource file MyControl.resources? Other ways to resolve this issue are also welcome.


Solution

  • In addition to Wim's technique, you can also declare a non-generic base control that has the same name as your generic class, and have your generic control/form derive from that non-generic base class.

    This way you can trick both the designer and the compiler into using the resource file from your generic class, and you get permanent designer support once the base class is setup without having to fiddle in the .designer file everytime you rebuild :

    // Empty stub class, must be in a different file (added as a new class, not UserControl 
    // or Form template)
    public class MyControl : UserControl
    {
    }
    
    // Generic class
    public class MyControl<T> : MyControl
    {
         // ...
    }
    

    The only requirements are to have exactly the same name for your generic class and its base class, and that the base class must be in another class file, otherwise the designer complains about not finding one of the two classes.

    PS. I tested this with forms, but it should work the same with controls.