Ich habe ein WinForm-UserControl mit einem generischen Typ für ein Steuerelement. Um die Instanz zu erstellen, änderte ich den Designer-Code:UserControl mit generischer Steuerung - Designer
public class TimeBarForm<T> : where T : TimeBarPanel
{
protected void InitializeComponent()
{
// ...
this.m_timeBarPanel = (T)Activator.CreateInstance(typeof(T));
// ...
}
}
Das bei der Kompilierung funktioniert gut, aber auf Design-Zeit, es ist gebrochen. Auf dem TimeBarForm:
Die abgeleiteten Klassen zeigen nur den Standard-Designer für ein leeres Benutzersteuerelement.
Ich habe auch versucht, den Typ im Konstruktor zu übergeben, aber VS beschwert sich, dass ich nicht automatisch erzeugten Code berühren sollte (Es ist nicht wie die If-Bedingungen). Ich möchte ein generisches UserControl, wo ich über die Spezialisierung einer abstrakten Klasse/Kontrolle in einem abgeleiteten Typ entscheiden kann und ich sollte noch in der Lage sein, den Designer in der Basisklasse zu verwenden. Ich bin offen für andere Vorschläge, um dies zu lösen, da dies möglicherweise nicht die beste Lösung ist. Ich bin nicht sehr an UserControl-Design gewöhnt.
VS 2015/.Net 4.6
Als generelle Regel, ändern Sie nicht Designer generierte Codes von Hand. Es kann den Designer beschädigen oder Ihre Codes können entfernt werden, wenn sich der Designer ändert. Der Designer arbeitet mit Parsing und Deserialisierung. Wie im Fehler beschrieben, konnte der Code nicht deserialisiert werden. Sehen Sie sich diesen Beitrag an [Designer kann beim Codieren eines Formulars in C# nicht angezeigt werden] (http://stackoverflow.com/a/32299687/3110834). Es enthält nützliche Informationen zur Funktionsweise des Designers. Außerdem enthält es ein interessantes Beispiel, das Ihnen hilft zu verstehen, wie der Designer arbeitet. –
Es ist möglich für Sie, Ihre Basissteuerung 'TimeBarPanel' nicht-abstrakt (wegen Designer Zweck) zu machen? –
Es ist nicht abstrakt in meiner aktuellen Implementierung. Aber ich muss die Spezialisierung irgendwie "injizieren". –