Je travaille sur une méthode qui crée dynamiquement des instances de collections dans nos entités. Mon problème est quand je crée nouveau record qui doit être inséré dans la base de données, mes ICollection
propriétés de navigation sont toujours nulles et dans ma méthode sûreCréer une instance de List en utilisant la réflexion C#
Je dois utiliser quelque chose comme ceci ci-dessous pour créer un nouveau List
et son approche certainement pas bon . Si je ne crée pas l'instance de List
, Mapper
va lancer l'erreur qu'il ne peut pas mapper Collection
de quelque chose à null
, par exemple il ne peut pas mapper Liste de Categories
à null.
échantillon de ma méthode sûre
//check if record exists in database so i know if have to update or insert record (based on entity Id)
var entity = repository.GetById(detail.Id)
//....some code removed for brevity
if (entity.Categories == null)
{
entity.Categories = new List<Category>();
}
if (entity.UserContacts == null)
{
entity.UserContacts = new List<UserContact>();
}
//dto => entity
Mapper.PopulateEntity(dto, entity);
//update or insert later on.
méthode d'extension qui doit créer une instance de List<T>
par exemple new List<Category>()
comme son ci-dessus.
public TEntity InitializeEntity(TEntity entity)
{
var properties = entity.GetType().GetProperties();
foreach (var prop in properties)
{
if (typeof(ICollection<TEntity>).Name == (prop.PropertyType.Name))
{
var get = prop.GetGetMethod();
//get assembly with entity namespace and class name
var fullName = get.GetBaseDefinition().ReturnType.GenericTypeArguments[0].AssemblyQualifiedName;
//create instance of object
var myObj = Activator.CreateInstance(Type.GetType(fullName));
//check if property is null or if get some value, dont want to rewrite values from database
var value = prop.GetValue(entity);
if (value == null)
{
var listType = typeof(List<>);
var constructedListType = listType.MakeGenericType(myObj.GetType());
Activator.CreateInstance(constructedListType);
}
}
}
return entity;
}
Pour une raison quelconque, il ne crée aucune instance du tout et je ne peux pas savoir où est le problème.
Ouais sa version beaucoup plus propre et fonctionne parfaitement. Merci – Martin