es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Implemente el método de interfaz genérica en una clase genérica.

¿Existe alguna manera de implementar la interfaz ISetter para evitar la necesidad de hacer boxing al asignar el valor? Una conversión directa (T)value obviamente no es posible (error de compilador). El tipo T puede ser un tipo de valor o de clase. La interfaz ISetter no debe ser genérica en sí misma, ya que debe ser utilizada como tipo de valor en un diccionario común para diferentes tipos T.

public interface ISetter
{
    void Set<T>(T value);
}

public class Prop<T> : ISetter
{
    public T Value;

    //Siempre se llamará con T1 == T
    public void Set<T1>(T1 value)
    {
        if (typeof(T1) != typeof(T)) throw new ArgumentException();
        Value = (T)(object)value;   //¿Existe alguna manera de evitar el boxing?
    }
}
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible implementar ISetter para evitar la conversión en boxes al asignar el valor. Para ello, se puede utilizar el método Convert.ChangeType. Este método convertirá el valor al tipo deseado sin generar una conversión en box.

    Por ejemplo, el siguiente código convertirá el valor al tipo deseado sin generar una conversión en box:

    public class Prop<T> : ISetter
    {
        public T Value;
    
        //Se llamará siempre que T1 == T
        public void Set<T1>(T1 value)
        {
            if (typeof(T1) != typeof(T)) throw new ArgumentException();
            Value = (T)Convert.ChangeType(value, typeof(T));
        }
    }
    

Comments are closed.