IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

[Reflection] Types Nullable et Delegate.CreateDelegate


Sujet :

C#

  1. #1
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Par défaut [Reflection] Types Nullable et Delegate.CreateDelegate
    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 :
    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())
    Provoque une exception de type ArgumentException avec le message :
    Erreur lors de la liaison avec la méthode cible.
    dès lors que le type de la propriété un Nullable<> quelconque.
    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

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    pourtant nullable<T> est juste une classe générique comme list<T>
    essaye avec list voir si tu as le même problème
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

Discussions similaires

  1. type Nullable(Of Integer)
    Par pacifiquement dans le forum ASP.NET
    Réponses: 8
    Dernier message: 25/01/2012, 17h19
  2. Type Nullable et T
    Par koyot3 dans le forum C#
    Réponses: 4
    Dernier message: 29/03/2011, 09h30
  3. Serialization d'une List<FileInfo> => Error reflecting types
    Par Radec dans le forum Windows Forms
    Réponses: 2
    Dernier message: 17/07/2008, 10h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo