2015-07-20 41 views
1

在「ProDinner」項目中,ValueInjecter用於映射。我使用最新版本,在實體和int []之間進行轉換時,用最新版本替換ConventionInjection和LoopInjection, EntitiesToInts類別:將int []轉換爲使用值注入器的實體

public class EntitiesToInts : LoopInjection 
{ 
    protected override bool MatchTypes(Type src, Type trg) 
    { 
     return trg == typeof(int[]) 
      && src.IsGenericType 
      && src.GetGenericTypeDefinition() == typeof(ICollection<>) 
      && src.GetGenericArguments()[0].IsSubclassOf(typeof(Entity)); 
    } 

    protected override void SetValue(object source, object target, PropertyInfo sp, PropertyInfo tp) 
    { 
     var val = sp.GetValue(source); 
     if (val != null) 
     { 
      tp.SetValue(target, (val as IEnumerable<Entity>).Select(o => o.Id).ToArray()); 
     } 
    } 
} 

如何完成IntsToEntities類?

回答

0

IntsToEntities在那裏,你可以看到它在DefaultMapperMapperConfig

// go from int[] to ICollection<Entity> 
public class IntsToEntities : LoopInjection 
{ 
    protected override bool MatchTypes(Type src, Type trg) 
    { 
     return src == typeof(int[]) 
      && trg.IsGenericType 
      && trg.GetGenericTypeDefinition() == typeof(ICollection<>) 
      && trg.GetGenericArguments()[0].IsSubclassOf(typeof(Entity)); 
    } 

     protected override void SetValue(object source, object target, PropertyInfo sp, PropertyInfo tp) 
     { 
      var sourceVal = sp.GetValue(source); 
      if (sourceVal != null) 
      { 
       var tval = tp.GetValue(target);// make EF load the collection before modifying it; without it we get errors when saving an existing object 

       dynamic repo = IoC.Resolve(typeof(IRepo<>).MakeGenericType(tp.PropertyType.GetGenericArguments()[0])); 
       dynamic resList = Activator.CreateInstance(typeof(List<>).MakeGenericType(tp.PropertyType.GetGenericArguments()[0])); 

       var sourceAsArr = (int[])sourceVal; 
       foreach (var i in sourceAsArr) 
        resList.Add(repo.Get(i)); 

       tp.SetValue(target, resList); 
      } 
     } 
    } 
+0

由於被使用,這就是我想要的。 – darrenji