2008-12-27 24 views
10

Tengo el siguiente control de usuario genérico declaró:¿Es posible hacer un control genérico en .Net 3.5?

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

Pero el compilador no permitirá que haga esto:

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

¿Cómo se crea un control de usuario genérico en C#?

Respuesta

16

probar este

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

public class MessageControlBase : MessageBase<Post> 
{} 

La clave para conseguir el diseñador de trabajo es que la clase base de la clase que se está editando no debe ser genérico.

+0

Gracias. Voy a intentar esto. –

+0

Solución fresca :) – leppie

+1

Sí, el diseñador es un "estúpido" instalador. Solo puede crear instancias de clases concretas: no abstractas, no genéricas. Esto es cierto tanto para la clase base como para los controles/componentes que están en el control que está editando. Con suerte, lo arreglarán algún día ... – configurator

1

Por un lado, aunque los controles genéricos son posibles en .NET, los diseñadores de Visual Studio no los admiten, por lo que está solo si desea usarlos. Tendrás que instanciarlos tú mismo en tu código y también realizar el diseño.

En cuanto al error que menciona, me parece que está mirando en la dirección incorrecta. ¿Quizás podría escribir todo el texto de error aquí?

1

.NET framework los admite, pero como los manejadores de Vilx, los diseñadores simplemente no lo hacen, y a ninguna de las plataformas basadas en xml/markup (xaml (wpf) o ASP.NET) no les van a gustar los genéricos. Entonces, el mejor consejo es: no los use.

Un compromiso común es tener una propiedad Type (o una propiedad de plantilla object sobre la que se llama GetType()), y simplemente lanzar etc. dentro del control. Del mismo modo, dicho uso comúnmente hará uso de cosas como Activator.CreateInstance y TypeDescriptor (para búsqueda de metadatos, etc.).

+0

supongo que no recuerdo mediante la vista de diseño en una ViewPage inflexible en ASP.NET MVC. ¿(O cómo lo hace) el diseñador maneja esto? – tvanfosson

+0

Gracias. Pero es un curioso descuido. –

+0

Ver la respuesta de Robert Wood. Es una forma de evitar ese problema específico y seguir usando el diseñador. Aunque es una solución alternativa, es mucho mejor que usar una propiedad Type. – configurator

Cuestiones relacionadas