Cómo pasar una clase genérica como un parámetro a un constructor de la clase no genérica

StackOverflow https://stackoverflow.com/questions/1493801

  •  18-09-2019
  •  | 
  •  

Pregunta

Supongamos el siguiente código (Por favor leer mi pregunta en los comentarios de código en la clase final):

//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()
    {}
}
¿Fue útil?

Solución

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

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

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

A continuación:

public class SynchRequest
{
    private ClientRequestInfo info;

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

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

Otros consejos

La clase tiene que ser genéricos si quieres variables miembro genéricos.

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

Es un miembro genérico.

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

class ClientRequestInfo<K,Y> : IClientRequestInfo

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

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

  1. Hacer una clase base no genérico, teniendo tanto el uso de la misma.
  2. Proporcionar una interfaz a utilizar, como ISynchInfo, y que su clase genérica implementa la interfaz.

En este caso, prefiero el enfoque de interfaz, ya que es posible que desee sincronizar otros tipos (separado de las solicitudes del cliente) en el futuro.

Hacer ClientRequestInfo (K, V) implementar una interfaz ClientRequestInfo con las funciones de interfaz SyncRequest hará necesidades.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top