10 Stimmen

Ist es möglich, eine generische Steuerung in .Net 3.5 zu erstellen?

Ich habe den folgenden generischen Benutzersteuerelement deklariert:

public partial class MessageBase : UserControl
    {
        protected T myEntry;
        public MessageBase()
        {
            InitializeComponent();
        }
        public MessageBase(T newEntry)
        {
            InitializeComponent();
            myEntry = newEntry;
        }    
    }
}

Aber der Compiler erlaubt mir nicht, dies zu tun:

public partial class MessageControl : MessageBase
{
    public MessageControl()
    {
        InitializeComponent();
    }
}

Wie erstelle ich ein generisches Benutzersteuerelement in C#?

16voto

rnwood Punkte 1480

Versuch das

public partial class MessageControl : MessageControlBase
{    
    public MessageControl()    
    {
        InitializeComponent();    
    }
}

public class MessageControlBase : MessageBase<Post>
{}

Der Schlüssel, um den Designer zum Laufen zu bringen, ist, dass die Basisklasse der Klasse, die du bearbeitest, nicht generisch sein darf.

2voto

dfddf Punkte 21

1voto

Vilx- Punkte 100739

Zum einen sind zwar generische Steuerelemente unter .NET möglich, die Visual Studio-Designer unterstützen sie jedoch nicht, so dass Sie auf sich allein gestellt sind, wenn Sie sie verwenden möchten. Sie müssen sie selbst in Ihrem Code instanziieren und auch das Layout übernehmen.

Was den von Ihnen genannten Fehler betrifft, hört es sich für mich so an, als ob Sie in die falsche Richtung schauen. Vielleicht könnten Sie den gesamten Fehlertext hier schreiben?

1voto

Marc Gravell Punkte 970173

Das .NET-Framework unterstützt sie, aber wie Vilx erwähnt, mögen die Designer sie einfach nicht - und jede der XML-/Markup-basierten Plattformen (XAML (WPF) oder ASP.NET) werden Generics überhaupt nicht mag. Also lautet der beste Ratschlag: Verwende sie nicht.

Ein häufiger Kompromiss ist es, eine Type-Eigenschaft (oder eine object-Vorlagen-Eigenschaft, auf der Sie GetType() aufrufen) zu haben und einfach innerhalb der Steuerung zu casten usw. Gleichfalls wird eine solche Verwendung oft Dinge wie Activator.CreateInstance und TypeDescriptor (für Metadatensuche usw.) nutzen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X