Je convertis un objet basé sur la réflexion comme ceci.
obj.GetType().GetProperties()
Il produit la liste des propriétés attendues.
{System.Reflection.PropertyInfo[4]}
[0] : {System.String Name}
[1] : {System.Guid[] Ids}
[2] : {System.String[] Tags}
[3] : {System.Nullable`1[System.Boolean] Status}
Ensuite, je veux effacer la liste des propriétés non utilisées, et j'ajoute donc la condition selon laquelle la valeur d'une propriété doit être différente de null
.
obj.GetType().GetProperties()
.Where(a => a.GetValue(obj) != null)
Il produit le résultat escompté pour les champs atomiques, mais pas pour les tableaux (car ils ne sont indéfiniment pas des null
, seulement vide).
{System.Linq.Enumerable.WhereArrayIterator<System.Reflection.PropertyInfo>}
[0] : {System.String Name}
[1] : {System.Guid[] Ids}
[2] : {System.String[] Tags}
Je ne suis pas sûr de savoir comment détecter les propriétés de tableaux non nuls mais vides afin de les exclure. Je ne peux pas me contenter de convertir un tableau (comme on l'a vu). aquí ) car toutes les propriétés ne sont pas des tableaux.
L'approche la plus proche que j'ai est ce morceau de "travail", qui semble être plutôt... indésirable. Il a cette odeur de code distincte.
obj.GetType().GetProperties()
.Where(a => a.GetValue(obj) != null
&& !(a.GetValue(obj) is Array && (a.GetValue(obj) as Array).Length == 0))
Et comme j'essaie de créer quelque chose avec elle en utilisant Select(a=>a.GetValue(obj))
il devient encore plus lourd et plus évident qu'il a besoin d'être amélioré. J'ai également remarqué qu'à chaque fois que le tableau n'est pas vide, mon mapping échoue à produire System.String%5b%5d
ce qui m'obligera probablement à clunkifier davantage le code.