2013-05-24 1 views
0

Im utilisant la réflexion pour obtenir des données dynamiquement (Les types d'entité sont définis au moment de l'exécution). Im retournant actuellement un seul objet chaque fois que mon currentObject n'a pas de relations 1: N (via l'implémentation de réflexion de méthode générique "First"), mais je dois aussi obtenir les childs 1: N, qui sont EntityCollection < T>.EntityCollection <T> à la liste <T> par réflexion

var valoresp = getFilho(pai, filho, raizAtual); 
     if (valoresp == null) 
      return new object(); 
if (!filho.A_Ocorrencia_Tabela.Contains("1:N")) 
     { 
      var firstMethod = typeof(Enumerable).GetMethods().Single(method => method.Name == "First" 
           && method.IsStatic && method.GetParameters().Length == 1); 
      var interfaceImplementation = MethodResolver.GetImplementationOfInterface(valoresp.GetType(), 
           firstMethod.GetParameters().First().ParameterType.GetGenericTypeDefinition()); 

      var genericArgumentsTypes = interfaceImplementation.GetGenericArguments(); 
      var genericMethod = firstMethod.MakeGenericMethod(new[] { genericArgumentsTypes[0] }); 
      try 
      { 
       var resultado = genericMethod.Invoke(null, new[] { valoresp }); 
       return resultado; 
      } 
      catch (Exception) 
      { 
       return new object(); 
      } 

     } 
     else 
     { 
      if (valoresp.GetType().IsGenericType && (valoresp.GetType().GetGenericTypeDefinition() == typeof(EntityCollection<>)) ) 
      { 
        //here is the problem: 
        var typeValoresp = valoresp as EntityCollection<object>; 


      } 
     } 

Le fait est mon "valoresp" variable peut être 480 différents types de EntityCollection (c'est pourquoi je ne vais pas vérifier manuellement le type) (EntityCollection < table1>, EntityCollection < Tableau2> ...)

J'ai besoin d'une liste des objets enfants, mais je n'ai pas trouvé de moyen de convertir EntityCollection en liste en utilisant la réflexion.

Répondre

0

Tout compris comment:

Au lieu d'essayer de jeter à EntityCollection, vérifiez d'abord si elle est dénombrable (depuis EntityCollection implémente IEnumerable) et coulé à Enumerable.

Ensuite, vous serez en mesure d'utiliser des requêtes LINQ, méthodes, etc ... Et en plus d'éviter la coulée à la liste (mais vous pouvez toujours, depuis IEnumerable a .ToList() Méthode)

if (valoresp is IEnumerable<object>) 
{ 

    var valorEnum = valoresp as IEnumerable<object>; 
    ... 
    //valorEnum.First/valorEnum.where(...) etc.. 
} 
Questions connexes