2009-09-29 30 views
5

Supongamos el siguiente código (por favor leer mi pregunta en los comentarios de código en la clase final):Cómo pasar una clase genérica como un parámetro a un constructor de la clase no genérica

//This is my Generic Class 
public class ClientRequestInfo<K, V> 
{ 
    public string Id { get; set; } 
    private Dictionary<K, V> parameters; 

    public ClientRequestInfo() 
    { 
     parameters = new Dictionary<K, V>(); 
    } 

    public void Add(K key, V value) 
    { 
     parameters.Add(key, value); 
    } 
} 

public class ProcessParameters() 
{ 
    private void CreateRequestAlpha() 
    { 
     ClientRequestInfo<int, string> info = new ClientRequestInfo<int, string>(); 
     info.Add(1, "Hello"); 
     SynchRequest s = new SynchRequest(info); 
     s.Execute(); 
    } 
    private void CreateRequestBeta() 
    { 
     ClientRequestInfo<int, bool> info = new ClientRequestInfo<int, bool>(); 
     info.Add(1, true); 
     SynchRequest s = new SynchRequest(info); 
     s.Execute(); 
    } 
} 

public class SynchRequest 
{ 
    //What type should I put here? 
    //I could declare the class as SynchRequest<K, V> but I don't want 
    //To make this class generic. 
    private ClientRequestInfo<????,?????> info; 
    private SynchRequest(ClientRequestInfo<?????,?????> requestInfo) 
    { 
     //Is this possible? 
     this.info = requestInfo; 
    } 

    public void Execute() 
    {} 
} 
+0

¿Por qué no quieres utilizar un SynchRequest genérico? – AnthonyWJones

+0

¿Puedes hablar sobre lo que harías en Execute() con el miembro de información? Esto puede proporcionar una base para una respuesta funcional equivalente. – joshperry

+0

Porque la clase SynchRequest es llamada por otras clases del proyecto y el propósito de SynchRequest es ejecutar el servicio y no proporcionar ningún tipo de información sobre el cliente. También hay clases que usan SynchRequest y no especifican ni requieren ninguna información del cliente. Entonces, no es un buen enfoque hacer que esta clase sea genérica. (SynchRequest tiene otro constructor vacío) – Ioannis

Respuesta

7

Si no desea hacer SynchRequestInfo genérico, ¿puede hacer una clase base no genérica para ClientRequestInfo? -

public abstract class ClientRequestInfo 
{ 
    public abstract void NonGenericMethod(); 
} 

public class ClientRequestInfo<K, V> : ClientRequestInfo 
{ 
    public override void NonGenericMethod() 
    { 
     // generic-specific implementation 
    } 
} 

continuación:

public class SynchRequest 
{ 
    private ClientRequestInfo info; 

    private SynchRequest(ClientRequestInfo requestInfo) 
    { 
     this.info = requestInfo; 
    } 

    public void Execute() 
    { 
     // ADDED: for example 
     info.NonGenericMethod(); 
    } 
} 
+0

Por supuesto, el método 'Execute' debe declararse en la clase base si' CreateRequestAlpha' y 'CreateRequestBeta' son capaces de invocarlo. –

+0

'Execute' es parte de' SynchRequest', no 'ClientRequestInfo'. –

2

La clase tiene que ser genérico si quiere variables de miembro genéricas.

private ClientRequestInfo<????,?????> info; 

Es un miembro genérico.

Puede utilizar una clase base no genérico o interfaz:

class ClientRequestInfo<K,Y> : IClientRequestInfo 

Pero en su ejemplo, ClientRequestInfo no tiene ningún miembros no genéricos, por lo que la clase de interfaz/base estaría vacía y tienen para ser convertida a la versión genérica correcta para ser útil de todos modos.

1

Usted tiene dos opciones, si quieres hacer no SynchRequestInfo genérico.

  1. Haz una clase base no genérica, ya que ambos la usan.
  2. Proporcione una interfaz para usar, como ISynchInfo, y haga que su clase genérica implemente la interfaz.

En este caso, preferiría el enfoque de la interfaz, ya que es posible que desee sincronizar otros tipos (aparte de las solicitudes del cliente) en el futuro.

1

Haga que ClientRequestInfo (K, V) implemente una interfaz ClientRequestInfo con las funciones de interfaz que necesitará SynchRequest.

Cuestiones relacionadas