Convertir une variable Object en Class [Résolu]

Messages postés
1428
Date d'inscription
mercredi 6 août 2003
Dernière intervention
18 novembre 2018
- - Dernière réponse : bouv
Messages postés
1428
Date d'inscription
mercredi 6 août 2003
Dernière intervention
18 novembre 2018
- 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
Afficher la suite 

Votre réponse

5 réponses

Messages postés
1728
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
14 décembre 2018
0
Merci
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

Commenter la réponse de vb95
Messages postés
12392
Date d'inscription
mardi 11 mars 2003
Dernière intervention
14 décembre 2018
0
Merci
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
Commenter la réponse de Whismeril
Messages postés
1428
Date d'inscription
mercredi 6 août 2003
Dernière intervention
18 novembre 2018
0
Merci
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
Commenter la réponse de bouv
Messages postés
1428
Date d'inscription
mercredi 6 août 2003
Dernière intervention
18 novembre 2018
0
Merci
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
Commenter la réponse de bouv
Messages postés
12392
Date d'inscription
mardi 11 mars 2003
Dernière intervention
14 décembre 2018
0
Merci
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

Whismeril
Messages postés
12392
Date d'inscription
mardi 11 mars 2003
Dernière intervention
14 décembre 2018
-
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
bouv
Messages postés
1428
Date d'inscription
mercredi 6 août 2003
Dernière intervention
18 novembre 2018
-
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
Commenter la réponse de Whismeril

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.