Convertir une variable Object en Class

Résolu
bouv Messages postés 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 - 17 nov. 2018 à 23:47
bouv Messages postés 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 - 18 nov. 2018 à 17:57
Bonjour,

Je rencontre un problème pour créer une variable dynamiquement sans en connaître d'avance le type.
Disons que j'ai une classe :

Public Class User
Public Property UserName as String
Public Property User
End Class

Quelque part ailleurs je vais appeler une procédure TEST comme cela

Dim oUser as New User
TEST (oUser)

Et dans ma procédure TEST j'aimerai faire quelque chose du genre

Public Sub TEST(ByVal oClass as Object)
Dim oItem As New Object
oItem = Convert.ChangeType(oItem, oClass.GetType)
.......
End Sub

J'ai également essayer CType et DirectCast mais sans succès.
Peut-être que j'utilise mal ces procédures

Merci d'avance

5 réponses

vb95 Messages postés 3417 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 20 mai 2023 165
Modifié le 18 nov. 2018 à 00:10
Bonjour
Et ainsi :
Public Class User 
    Public Property UserName as String 
    Public Property UserObj as Object ' on lui affecte la classe de base Object 
End Class 

' Quelque part ailleurs je vais appeler une procédure TEST comme cela 

Dim oUser as New UserObj 
TEST (oUser) 

' Et dans ma procédure TEST j'aimerai faire quelque chose du genre 

Public Sub TEST(ByVal oClass as Object) 
    Dim oItem As New Object = oClass 
. 
End Sub 


J'ai modifié la propriété User en UserObj pour la différencier de la classe User

0
Whismeril Messages postés 18399 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 29 mai 2023 623
Modifié le 18 nov. 2018 à 09:26
Bonjour

as tu essayé avec tryCast?

    Dim oItem As User = TryCast(titi, User)
    If oItem Is Nothing Then MessageBox.Show("L'objet n'est pas un User")


Après si ton besoin est que ce soit forcément un User, pourquoi ne pas passer directement un User en paramètre?
Quand j'étais petit, la mer Morte n'était que malade.
George Burns
0
bouv Messages postés 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 1
18 nov. 2018 à 10:12
Bonjour
Merci de votre aide

vb95>>Je ne veux (peux) pas modifier la classe User qui sert de Model à ma base de données.

Whismeril>>TryCast ne fonctionne pas non plus. Et bien entendu, je n'ai pas forcément besoin d'un User. L'idée est justement de pouvoir traiter plusieurs scénarii dans la même procédure. Des fois ce sera un User des fois autre chose.
D'ailleurs le paramètre "ByVal oClass as Object" ne contient aucune valeur (dans notre exemple juste un New User vide de données). Il ne sert à rien d'autre qu'informer la procédure du type de class qu'elle va traiter.

L'idée serait vraiment de faire quelques chose du type

Dim oItem as MemeTypeQue(oClass)

Merci
0
bouv Messages postés 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 1
18 nov. 2018 à 15:45
Bon après des heures de recherches j'ai fini par trouver.

La réponse se trouve ici : https://stackoverflow.com/questions/9233046/duplicate-object-and-working-with-duplicate-without-changing-original

Dans mon cas cela se matérialise comme ça :

Public Sub TEST(Of T) (ByVal oClass as Object)
    Dim oItem As Object = Clone(Of T)(oClass) 
    ......

End Sub 

Private Function Clone(Of T)(ByVal Source As Object) As Object
    If Not GetType(T).IsSerializable Then
        Throw New ArgumentException("The type must be serializable.", "source")
    End If
    If Object.ReferenceEquals(Source, Nothing) Then
        Return Nothing
    End If
    Dim formatter As System.Runtime.Serialization.IFormatter = New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter()
    Dim stream As System.IO.Stream = New System.IO.MemoryStream()
    Using stream
        formatter.Serialize(stream, Source)
        stream.Seek(0, System.IO.SeekOrigin.Begin)
        Return CType(formatter.Deserialize(stream), T)
    End Using
End Function


Merci encore
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Whismeril Messages postés 18399 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 29 mai 2023 623
18 nov. 2018 à 16:01
Houlala.

Je ne veux (peux) pas modifier la classe User qui sert de Model à ma base de données
VB (salut) a raison, avoir une propriété du même nom que la classe n'est pas judicieux, peut-être peux tu changer le nom de la classe.

Et bien entendu, je n'ai pas forcément besoin d'un User. L'idée est justement de pouvoir traiter plusieurs scénarii dans la même procédure. Des fois ce sera un User des fois autre chose.
oui mais quoi comme autre chose, si c'est des voitures, ou des organes, pas sûr qu'un traitement commun soit le mieux.

D'ailleurs le paramètre "ByVal oClass as Object" ne contient aucune valeur (dans notre exemple juste un New User vide de données). Il ne sert à rien d'autre qu'informer la procédure du type de class qu'elle va traiter.
alors
New User vide de données
ça n'est pas
aucune valeur
c'est un User.
Aucune valeur c'est Nothing.

Il ne sert à rien d'autre qu'informer la procédure du type de class qu'elle va traiter.
je ne suis pas sûr de comprendre, mais si j'ai compris
    If TypeOf titi Is user Then
        MessageBox.Show("c'est un User")
    End If
répondrait à ta demande.
Cependant, c'est pas ce que je ferai, en faisant ça:
  • tu alloues un espace mémoire pour le contenu d'un User (même si y'a rien)
  • tu alloues un espace mémoire pour la référence vers ce contenu
  • tu as mis ByVal, donc tu copies l'espace mémoire du contenu dans un nouvelle espace mémoire et tu crées une nouvelle référence

Tout ça pour dire "eh coco tu moulines un User"

Et bien, une énumération, te prend la taille d'un Integer (avec ByRef) et ferait la même chose de façon lisible
Enum Traitement
    Defaut
    User
    Bidule
    Machin
End Enum


'plus loin
Select Case monTraitrement
    Case Traitement.User
           'faire le truc de User
    Case Traitement.Bidule
           'faire le truc de bidule
End Select

0
Whismeril Messages postés 18399 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 29 mai 2023 623
Modifié le 18 nov. 2018 à 17:36
Ha tu as posté ta réponse pendant que je tapais la mienne.
Pour le coup avec tout le contexte, je comprends un peu mieux le besoin
0
bouv Messages postés 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 1
18 nov. 2018 à 17:57
Pour la propriété User j'ai juste oublié de saisir la suite : Public Property UserXXX as String
Je n'ai effectivement pas de propriété du même nom que la classe, cela pourrait porter à confusion

Merci encore de ton intérêt
0