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.

Pasar List al método que espera List en C#

Estoy creando una aplicación que devuelve una lista de metales para usar en diversas condiciones. Tengo una clase llamada “Metal” y luego clases para cada tipo de metal, como “Steel” (acero), “Aluminum” (aluminio), etc. Si tengo una lista de Steels diferentes, quiero seleccionar primero los mejores en base a un conjunto de propiedades comunes a todos los metales, y luego hacer un segundo análisis basado en las propiedades únicas del acero. (Este no es mi problema exacto, pero mi problema es análogo).

No puedo averiguar cómo pasar un List al método “GetBest()” de la clase “Metal”, como se muestra a continuación, que toma su primer argumento de tipo List. El código no se compila debido a un error en la línea resaltada a continuación con **: “Argumento 1: no se puede convertir de ‘System.Collections.Generic.List‘ a ‘System.Collections.Generic.List‘.

“`csharp
public class Metal {

<pre><code>public int PropA { get; set; }

public List<metal> GetBest(List<metal> list, int condition1 )
{
var best = new List<metal>();

//Código de análisis aquí…

return best;
}
</code></pre>

}

public class Steel : Metal
{
public int PropB { get; set; }

<pre><code>public List<steel> GetBest(List<steel> list, int condition1, int condition2 ) {

var bestSteel = new List<steel>();

//Realizar primera selección basada en las propiedades de todos los metales.
**bestSteel = Metal.GetBest(list, condition1);**

//Realizar un análisis adicional basado en las propiedades únicas del acero.
//Código de análisis aquí…

return bestSteel;

}
</code></pre>

}
“`

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para poder pasar una List al método GetBest() de la clase Metal, debes hacer que la clase Metal y su método GetBest() sean genéricos. Esto se puede hacer agregando un parámetro de tipo a las declaraciones de la clase y del método. Aquí tienes el código modificado:

    public class Metal<t> where T : Metal<t>
    {
        public int PropA { get; set; }
    
        public List<t> GetBest(List<t> list, int condition1)
        {
            var best = new List<t>();
    
            //Código de análisis aquí...
    
            return best;
        }
    }
    
    public class Steel : Metal<steel>
    {
        public int PropB { get; set; }
    
        public List<steel> GetBest(List<steel> list, int condition1, int condition2)
        {
            var bestSteel = new List<steel>();
    
            //Realizar una selección inicial en función de las propiedades de todos los metales.
            bestSteel = ((Metal<steel>)this).GetBest(list, condition1);
    
            //Realizar un análisis adicional en función de las propiedades únicas del acero.
            //Código de análisis aquí...
    
            return bestSteel;
        }
    }
    

    Ahora la clase Metal tiene un parámetro de tipo T que está limitado a ser del tipo Metal<t>. El método GetBest() también utiliza el parámetro de tipo para devolver una lista del mismo tipo que la lista de entrada.

    En la clase Steel, el método GetBest() ahora llama al método GetBest() de la clase Metal utilizando ((Metal<steel>)this) para convertir this en un Metal<steel>. Esto permite que la clase Steel pase una List al método GetBest() de la clase Metal.

Comments are closed.