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
</datarow,>
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;
}
}
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ónMap
en él. Aquí está cómo puede modificar su funciónConvertToList
para admitir varios modelos:En esta función modificada, creamos un objeto
MapperConfiguration
una vez y lo utilizamos para crear un mapeador. Luego, para cada fila en laDataTable
, creamos una instancia del modelo dinámico usandoActivator.CreateInstance
y llamamos a la funciónMap
en él utilizando reflexión. El modelo mapeado resultante se agrega a la listaresults
.Para utilizar esta función para un modelo específico, debería llamarla de la siguiente manera:
Esto convertiría
userDataTable
en una lista de objetosUser
utilizando la funciónMap
definida en la claseUser
.</datarow,>