2017-09-11 3 views
0

Dans la structure d'entité, j'ai une classe principale avec des définitions ICollection pour 2 sous-classes. Class2 implémente l'interface ITotal ... Class3 ne le fait pas. Class2 implémente l'interface ITotal ... Class3 ne le fait pas.Comment obtenir une liste des propriétés de navigation qui implémentent une interface dans entity framework

Au total, Class1 a environ 30 instances de ICollections où l'objet de base implémente l'interface ITotal. Il a également 10+ ICollections qui n'implémentent pas l'interface.

Dans Class1, je dois être capable d'obtenir dynamiquement toutes ICollections dont le type de base implémente l'interface ITotal. Ensuite, je vais ajouter les champs "Total" pour obtenir un total global. La raison pour laquelle j'ai besoin d'être dynamique est parce que je vais ajouter beaucoup plus d'ICollections à la classe 1 et je ne veux pas avoir à me souvenir d'aller à plusieurs endroits pour que les totaux soient précis. Ci-dessous un exemple de ce que j'ai jusqu'à présent ... ce morceau de code me donne toutes les classes ICollection, mais maintenant je suis coincé. Idéalement, je pourrais ajouter une autre clause Where après la dernière sélection, mais je suis prêt à la supprimer complètement.

var value1 = t.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance) 
          .Where(x => x.CanWrite && x.GetGetMethod().IsVirtual) 
          .Select(x => x.GetValue(this, null)) 
          .Where(x => x != null) 
          .Where(x => x.GetType().GetInterfaces().Any(y => y.IsGenericType && y.GetGenericTypeDefinition() == typeof(ICollection<>))) 
          .Select(x=> ((IEnumerable)x)) 
          .ToList() 
          ; 

Des pensées?

Répondre

0

Comme ceci:

 var c = new Class1(); 

     //. . . 

     var q = from p in typeof(Class1).GetProperties() 
       where p.PropertyType.IsConstructedGenericType 
        && p.PropertyType.GetGenericTypeDefinition().Equals(typeof(ICollection<>)) 
        && typeof(ITotal).IsAssignableFrom(p.PropertyType.GetGenericArguments()[0]) 
       select p; 

     var ITotalCollections = q.ToList(); 

     var q2 = from p in ITotalCollections 
       from i in (IEnumerable<ITotal>)p.GetValue(c) 
       select i.Total; 

     var total = q2.Sum(); 
+0

fonctionne parfaitement. Merci. –