Order By Lambda sur une arborescence d'objet
Bonjour,
J'ai une problématique d'expressions lambda. L'idée est de trier une liste en fonction de propriétés contenues dans une arborescence de chaque objet (profondeur de 1 à 5 sur le projet réel en fonction de la demande).
Pour ce faire, on crée un expression lambda en dehors de Linq via des ExpressionMember (code simplifié).
Code:
1 2 3 4 5
| var param = Expression.Parameter(typeof(MaClasse));
SortDirection sortDirection = SortDirection.Descending;
MemberExpression keySelectExpr = Expression.Property(Expression.Property(param, "MaSousClasse"), "MonNom") ;
// On utiliser la classe Sorter définie dans l'assembly courante
IList<MaClasse> orderedList = new SorterClass<MaClasse>().Sort(maListe, param, keySelectExpr, sortDirection); |
avec la classe "MaClasse" super complexe:
Code:
1 2 3 4 5
| class MaClasse
{
public String MonNom { get; set; }
public MaClasse MaSousClasse { get; set; }
} |
L'évaluation fonctionne bien si tous les chemins existent (toutes les instances de MaClasse de premier niveau contiennent une référence) mais l'évaluation plante s'il manque au moins une des sous références. Ainsi avec la liste suivante:
Code:
1 2 3
| IList<MaClasse> maListe = new List<MaClasse> {
new MaClasse{MonNom = "AAAA", MaSousClasse = new MaClasse{MonNom = "BBBB.AAAA"}},
new MaClasse{MonNom = "Test", MaSousClasse = null}}; |
L'évaluation "MaSousClasse.MonNom" ne peut s'exécuter car l'une des références de MaSousClasse est vide.
Une exception de type NullReferenceException est levée par le Convert.
Est-ce qu'il y a un moyen pour intervenir lors de l'évaluation pour chaque instance ?
Ou est-ce qu'il y a un moyen de lui fournir une valeur par défaut lorsqu'une référence est nulle ?
Ou un autre moyen ?
Yannick