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.

Cómo llamar a un método genérico

Tengo dos modelos relacionados

ModelBase.cs

public class ModelBase
{
    public virtual ModelBase Map(DataRow dr)
    {
        return this;
    }
}

User.cs que deriva de la clase anterior. En el futuro quiero tener más clases como User donde pueda asignar campos de DataRow a mis propiedades

public class User : ModelBase
{
    public string Id { get; set; }
    public string Apellido { get; set; }
    public string Nombre { get; set; }

    public User() { }

    public override User Map(DataRow dr)
    {
        var config = new MapperConfiguration(cfg => cfg.CreateMap<datarow, user="">()
            .ForMember(dest => dest.Id, opt => opt.MapFrom(row => row["x"]))
            .ForMember(dest => dest.Nombre, opt => opt.MapFrom(row => row["xx"]))
            .ForMember(dest => dest.Apellido, opt => opt.MapFrom(row => row["xxx"]))
        );

        var mapper = config.CreateMapper();
        return mapper.Map<user>(dr);
    }
}

Recibo Usuarios como DataTable, así que he creado un método sencillo para convertirlo a una lista, pero si hay más clases (todas recibidas como DataTables), quiero que mi función sea flexible y válida con el resto de mis modelos.
La pregunta es ¿cómo puedo usar esto de manera dinámica?

Utility.cs

csharp
public class DataTableConverter<t> where T : ModelBase
{
public static List<t> ConvertToList(DataTable dt, Type type)
{
var results = new List<t>(dt.Rows.Count);
foreach (DataRow row in dt.Rows)
{
// Aquí quiero llamar a la función Map del modelo dinámico y agregarlo a los resultados
}
return results;
}
}
</datarow,>

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para utilizar esto de forma dinámica, puede usar la clase Activator para crear una instancia del modelo dinámico en tiempo de ejecución y luego llamar a la función Map en él. Aquí está cómo puede modificar su función ConvertToList para admitir varios modelos:

    public static List<t> ConvertToList(DataTable dt, Type type)
    {
        var results = new List<t>(dt.Rows.Count);
        var config = new MapperConfiguration(cfg =>
        {
            cfg.CreateMap<datarow, t="">();
        });
        var mapper = config.CreateMapper();
        foreach (DataRow row in dt.Rows)
        {
            var model = Activator.CreateInstance(type);
            T mappedModel = (T)type.GetMethod("Map").Invoke(model, new object[] { row });
            results.Add(mappedModel);
        }
        return results;
    }
    

    En esta función modificada, creamos un objeto MapperConfiguration una vez y lo utilizamos para crear un mapeador. Luego, para cada fila en la DataTable, creamos una instancia del modelo dinámico usando Activator.CreateInstance y llamamos a la función Map en él utilizando reflexión. El modelo mapeado resultante se agrega a la lista results.

    Para utilizar esta función para un modelo específico, debería llamarla de la siguiente manera:

    var users = DataTableConverter<user>.ConvertToList(userDataTable, typeof(User));
    

    Esto convertiría userDataTable en una lista de objetos User utilizando la función Map definida en la clase User.</datarow,>

Comments are closed.