2017-10-17 37 views
1

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.

Répondre

1

Vous avez oublié de définir la valeur sur la propriété via prop.SetValue. Voici une version un peu nettoyée de votre code avec ce problème corrigé:

public static TEntity InitializeEntity<TEntity>(TEntity entity) 
{ 
    var properties = entity.GetType().GetProperties(); 
    foreach (var prop in properties) 
    { 
     if (prop.PropertyType.IsGenericType && prop.PropertyType.GetGenericTypeDefinition() == typeof(ICollection<>)) 
     {           
      //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 itemType = prop.PropertyType.GetGenericArguments()[0]; 
       var listType = typeof(List<>); 
       var constructedListType = listType.MakeGenericType(itemType); 
       prop.SetValue(entity, Activator.CreateInstance(constructedListType)); 
      } 
     } 
    } 
    return entity; 
    } 
+0

Ouais sa version beaucoup plus propre et fonctionne parfaitement. Merci – Martin