Bonjour,
Pour un projet, je suis obligé d'utiliser la reflection assez souvent, hors personne n'ignore que autant obtenir les informations de reflection ne coute rien, autant faire des appels dynamiques de méthodes ou faire des GetValue sur une propriété (vu que ca équivaut à un appel dynamique sur le getter de la propriété) est particulièrement dramatique question performances.
Habituellement pour palier à ce genre de problème on passe par les delegate et tout particulièrement Delegate.CreateDelegate() qui permet d'obtenir un délégué de type Func<object>.
Même si habituellement cela fonctionne, car le système s'occupe lui même de faire les éventuels boxing/unboxing due à l'usage d'un object en retour, cela ne fonctionne plus dès lors que la propriété est de type Nullable<T>
En effet ce code :
Provoque une exception de type ArgumentException avec le message :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 // target est une instance (non nulle) du type qui déclare la propriété // p est un PropertyInfo sur la propriété // setter est un setter généré via LCG var gmi = p.GetGetMethod(True) Func<object> getter = Delegate.CreateDelegate(typeof(Func<object>), obj, gmi); setter(target, getter())dès lors que le type de la propriété un Nullable<> quelconque.Erreur lors de la liaison avec la méthode cible.
Cela fonctionne avec n'importe quel type SAUF les types nullable où il refuse tout bonnement de faire la liaison...
Si quelqu'un a déjà rencontré ce problème et sait comment le contourner, je lui serais très reconnaissant de me renseigner...
Car en dehors même du fonctionnement du projet (je peux toujours faire autrement) j'aimerais bien comprendre d'où cela provient.
Visiblement il y a souvent et de nombreux problèmes avec les types nullables...
Merci par avance
Partager