2008-12-27 8 views
10

Ich habe die folgende allgemeine Usercontrol bekommt erklärt:Ist es möglich, in .Net 3.5 ein generisches Steuerelement zu erstellen?

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

Aber der Compiler wird mir nicht erlauben, dies zu tun:

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

Wie erstelle ich eine Benutzersteuerung in C#?

Antwort

16

dieses Versuchen

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

public class MessageControlBase : MessageBase<Post> 
{} 

Der Schlüssel der Designer an die Arbeit zu bekommen, ist, dass die Basisklasse der Klasse, die Sie nicht generisch sein bearbeiten müssen.

+0

Danke. Ich werde es versuchen. –

+0

Cool Workaround :) – leppie

+1

Ja, der Designer ist ein "dummer" Instantiator. Es kann nur konkrete Klassen instanziieren - nicht-abstrakt, nicht-generisch. Dies gilt sowohl für die Basisklasse als auch für alle Steuerelemente/Komponenten, die sich auf dem Steuerelement befinden, das Sie bearbeiten. Hoffentlich werden sie es eines Tages reparieren ... – configurator

1

Zum einen, obwohl generische Steuerelemente unter .NET möglich sind, die Visual Studio Designer sie nicht unterstützen, so dass Sie auf eigene Faust sind, wenn Sie sie verwenden möchten. Sie müssen sie selbst in Ihrem Code instanziieren und auch das Layout durchführen.

Für den Fehler, den Sie erwähnen, es klingt für mich, als ob Sie in die falsche Richtung suchen. Vielleicht könnten Sie den ganzen Fehlertext hier schreiben?

1

Das .NET-Framework unterstützt sie, aber als Vilx-Manationen, die Designer einfach nicht - und jede der Xml/Markup-basierten Plattformen (XAML (WPF) oder ASP.NET) wird überhaupt keine Generika mögen. Der beste Rat lautet also: Benutze sie nicht.

Ein üblicher Kompromiss besteht darin, eine Type Eigenschaft (oder eine object Template-Eigenschaft, auf der Sie GetType() aufrufen) zu haben und einfach in das Steuerelement zu werfen. Genauso wird eine solche Verwendung üblicherweise Dinge wie Activator.CreateInstance und TypeDescriptor (für Metadatensuche usw.) verwenden.

+0

Ich glaube, ich erinnere mich nicht, die Entwurfsansicht auf einer stark typisierte Viewpage in ASP.NET MVC verwenden. Geht (oder wie) der Designer damit um? – tvanfosson

+0

Danke. Aber es ist eine neugierige Aufsicht. –

+0

Siehe Robert Woods Antwort. Es ist eine Möglichkeit, dieses spezifische Problem zu umgehen und trotzdem den Designer zu verwenden. Auch wenn es sich hierbei um eine Problemumgehung handelt, ist es viel besser, als eine Type-Eigenschaft zu verwenden. – configurator

Verwandte Themen