Salut,

J'essaie de construire "manuellement" l'arbre d'expression correspondant à la requête LINQ suivante :
Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
            IQueryable<Type> q = from t in types
                                 where t.Name == "Object"
                                 select t;

Pour ça je me base sur l'exemple présenté ici :
http://msdn2.microsoft.com/en-us/library/bb882637.aspx

J'ai adapté le code, c'est pareil en plus simple, sauf que je teste la propriété Name des éléments :
Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
            IEnumerable<Type> typesArray = AppDomain.CurrentDomain.GetAssemblies().SelectMany(asm => asm.GetTypes());
            IQueryable<Type> types = typesArray.AsQueryable<Type>();
 
            ParameterExpression pe = Expression.Parameter(typeof(Type), "type");
            MemberExpression propTypeName = Expression.Property(pe, "Name");
            BinaryExpression eqName = Expression.Equal(propTypeName, Expression.Constant("Object"));
            Expression whereExpr = Expression.Call(
                typeof(Queryable),
                "Where",
                new Type[] { types.ElementType },
                types.Expression,
                Expression.Lambda<Func<Type, bool>>(eqName, new ParameterExpression[] { pe }));
 
            IQueryable<Type> results = types.Provider.CreateQuery<Type>(whereExpr);
Ca s'exécute sans erreur, mais le filtrage ne fonctionne pas... results contient tous les types de tous les assemblies chargés

Je comprends pas trop ce qui va pas... je suppose que c'est au niveau du test sur la propriété, vu que c'est la principale différence avec l'exemple de MSDN.

Quelqu'un a déjà fait ce genre de chose, ou aurait une idée sur le problème ?

Le "but ultime" de tout ça, c'est d'être capable de générer dynamiquement une requête LINQ pour rechercher des types par réflexion, selon différents critères (nom, interface implémentée, classe parente, méthodes exposées...). Mais si je n'arrive même pas à construire statiquement une requête super simple, je suis pas près de le faire dynamiquement