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

VB.NET Discussion :

Cast impossible d'un objet(of T)


Sujet :

VB.NET

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 84
    Points : 52
    Points
    52
    Par défaut Cast impossible d'un objet(of T)
    Bonjour,

    J'ai créé un objet_data(Of T) contenant un nom et une variable de type T (integer, float, string...)
    A l'aide d'un ConcurrentDictionary, je recherche un objet depuis son nom.
    Je parviens à le trouver mais pas à le caster convenablement

    Pour expliquer, voici mon code est en rouge les lignes me posant problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
       'ma classe de base
        Public MustInherit Class objet_data
            Public ReadOnly sName As String
     
            Protected Sub New(ByVal name As String)
                Me.sName = name
            End Sub
        End Class
     
        'Mon_objet_data mais avec une variable _obj_Value de type non connu (integer, string, float, double)
        Public Class objet_data(Of T) : Inherits objet_data
            Private _obj_Value As T
     
            Public Sub New(ByVal name As String)
                MyBase.New(name)
            End Sub
        End Class
     
    #Region "Le référentiel de mes objets"
        Private Interface I_Object_Data_Repository ' Déclaration de mon interface
            Sub Add(Of T)(dataRef As objet_data(Of T)) ' Ajoute un objet DATA dans le referentiel (dictionnaire)
            Function [Get](Of T)(sName As String) As objet_data(Of T) ' Retourne un objet data trouvé depuis son nom et son type
            Function [Get](sName As String, type As Type) As objet_data  'Retourne un objet data(of T) trouvé depuis son nom seul
        End Interface
     
        Private Class Object_Data_Repository
            Implements I_Object_Data_Repository
     
            Protected ReadOnly Dictionnaire_de_Mes_objets_data As New ConcurrentDictionary(Of String, Object)()
     
            'Ajoute un objet DATA dans le referentiel (dictionnaire)
            Private Sub Add(Of T)(ByVal Current_objet_data As objet_data(Of T)) Implements I_Object_Data_Repository.Add
                Dictionnaire_de_Mes_objets_data.TryAdd(Current_objet_data.sName, Current_objet_data)
            End Sub
     
            'Retourne un objet data trouvé depuis son nom et son type
            Private Function Get_a_Objet_data(ByVal sName As String, type As Type) As objet_data Implements I_Object_Data_Repository.Get
                Dim my_searched_data As Object = Nothing
                Dictionnaire_de_Mes_objets_data.TryGetValue(sName, my_searched_data)
     
                Return TryCast(my_searched_data, objet_data)
            End Function
     
            'Retourne un objet data(of T) trouvé depuis son nom seul
            Private Function Get_a_Objet_data(Of T)(ByVal sName As String) As objet_data(Of T) Implements I_Object_Data_Repository.Get
                Dim my_searched_data As Object = Nothing
                Dictionnaire_de_Mes_objets_data.TryGetValue(sName, my_searched_data)
     
                'ICI my_searched_data a bien été trouvé
                'Par contre impossible de le caster en objet_data(Of T). Voici les deux tentatives :
                Return TryCast(my_searched_data, objet_data(Of T)) "==> return NOTHING"
                Return CType(my_searched_data, objet_data(Of T)) "==> génère une erreur Impossible d'effectuer un cast d'un objet de type 'objet_data`1[System.Single]' en type 'objet_data`1[System.Single[]]'."
            End Function
        End Class
    #End Region
    L'erreur indique que je tente de caster du single en tableau de single (single()) mais je ne comprend pas pourquoi.

    Voyez-vous ce qui cloche ?

    Merci pour votre aide

    Dan

    Avez-vous une idée du probléme

  2. #2
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    Sans avoir le code où tu ajoutes ton objet (avec sa déclaration et/ou son assignation) dans Object_Data_Repository ça va être difficile de savoir ce qu'il se passe

    Sinon pourquoi tu as choisis Object comme type pour la valeur dans le dictionnaire et pas object_data vu que ton Add ne prend que des object_data(Of T) qui sont des object_data ?

    (C'est la mode des conventions de nommage "spéciales" en ce moment...)
    Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )
    À quelle heure dormez-vous ?
    Censément, quelqu'un de sensé est censé s'exprimer sensément.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 84
    Points : 52
    Points
    52
    Par défaut
    Merci pour ta réponse.

    1 - Ci-dessous le code pour l'assignation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    'ASSIGNATION D'UN OBJECT
    Dim My_object_repository As I_Object_Data_Repository = New Object_Data_Repository() ' déclaration de mon référentiel (fait 1 x)
    'Pour chaque nouvel object
    Dim New_object As New objet_data(Of Single)("my_test")
    My_object_repository.Add(New_object)
    2 - J'ai changé le type object utilisé par le dictionnaire (mais ne change pas le problème de cast)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
       'ma classe de base
        Public MustInherit Class objet_data
            Public ReadOnly sName As String
     
            Protected Sub New(ByVal name As String)
                Me.sName = name
            End Sub
        End Class
     
        'Mon_objet_data mais avec une variable _obj_Value de type non connu (integer, string, float, double)
        Public Class objet_data(Of T) : Inherits objet_data
            Private _obj_Value As T
     
            Public Sub New(ByVal name As String)
                MyBase.New(name)
            End Sub
        End Class
     
    #Region "Le référentiel de mes objets"
        Private Interface I_Object_Data_Repository ' Déclaration de mon interface
            Sub Add(Of T)(current_objet_data As objet_data(Of T)) ' Ajoute un objet DATA dans le referentiel (dictionnaire)
            Function [Get](Of T)(sName As String) As objet_data(Of T) ' Retourne un objet data trouvé depuis son nom et son type
            Function [Get](sName As String, type As Type) As objet_data  'Retourne un objet data(of T) trouvé depuis son nom seul
        End Interface
     
        Private Class Object_Data_Repository
            Implements I_Object_Data_Repository
     
            Protected ReadOnly Dictionnaire_de_Mes_objets_data As New ConcurrentDictionary(Of String, objet_data)()
     
            'Ajoute un objet DATA dans le referentiel (dictionnaire)
            Private Sub Add(Of T)(ByVal Current_objet_data As objet_data(Of T)) Implements I_Object_Data_Repository.Add
                Dictionnaire_de_Mes_objets_data.TryAdd(Current_objet_data.sName, Current_objet_data)
            End Sub
     
            'Retourne un objet data trouvé depuis son nom et son type
            Private Function Get_a_Objet_data(ByVal sName As String, type As Type) As objet_data Implements I_Object_Data_Repository.Get
                Dim my_searched_data As objet_data = Nothing
                Dictionnaire_de_Mes_objets_data.TryGetValue(sName, my_searched_data)
     
                Return TryCast(my_searched_data, objet_data)
            End Function
     
            'Retourne un objet data(of T) trouvé depuis son nom seul
            Private Function Get_a_Objet_data(Of T)(ByVal sName As String) As objet_data(Of T) Implements I_Object_Data_Repository.Get
                Dim my_searched_data As objet_data = Nothing
                Dictionnaire_de_Mes_objets_data.TryGetValue(sName, my_searched_data)
     
                'ICI my_searched_data a bien été trouvé
                'Par contre impossible de le caster en objet_data(Of T). Voici les deux tentatives :
                Return TryCast(my_searched_data, objet_data(Of T)) "==> return NOTHING"
                Return CType(my_searched_data, objet_data(Of T)) "==> génère une erreur Impossible d'effectuer un cast d'un objet de type 'objet_data`1[System.Single]' en type 'objet_data`1[System.Single[]]'."
            End Function
        End Class
    #End Region

  4. #4
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    Je viens de copier coller ton code j'ai juste rajouter un appel à Get pour récupérer l'objet et ça fonctionne sans problème avec le TryCast
    Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )
    À quelle heure dormez-vous ?
    Censément, quelqu'un de sensé est censé s'exprimer sensément.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 84
    Points : 52
    Points
    52
    Par défaut
    Tu as tout à fait raison et je viens de trouver pourquoi cela ne fonctionnait pas pour moi.
    L'erreur venait de la façon dont j’appelais le get

    J'avais ce bout de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim found_object As objet_data(Of Single()) = Get_Object(Of Single())("my_test")
     
        Public Function Get_Object(Of T)(s_name As String) As objet_data(Of T)
            Return My_object_repository.[Get](Of T)(s_name)
        End Function
    Quand je recherchais mon objet My_test je lui demandais de le faire en tant que single() et non single.
    Le message d'erreur était pourtant explicite... vivement les vacances.

    Merci pour ton aide, cela m'a permis de pointer plus rapidement le problème.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [JAVA 5.0] Generics - Cast et creation d'objets
    Par bourbaki2003 dans le forum Langage
    Réponses: 12
    Dernier message: 14/03/2007, 15h34
  2. Réponses: 2
    Dernier message: 07/03/2007, 14h27
  3. Cast dynamique d'un objet ?
    Par elitost dans le forum Langage
    Réponses: 2
    Dernier message: 02/05/2006, 10h43
  4. CAST impossible
    Par inertia dans le forum MFC
    Réponses: 5
    Dernier message: 08/06/2005, 14h28
  5. Réponses: 8
    Dernier message: 14/01/2005, 09h06

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