bizmoute
Messages postés29Date d'inscriptionvendredi 21 mars 2003StatutMembreDernière intervention21 novembre 2008
-
24 sept. 2008 à 15:27
bizmoute
Messages postés29Date d'inscriptionvendredi 21 mars 2003StatutMembreDernière intervention21 novembre 2008
-
24 sept. 2008 à 17:30
Language utilisé : VB.NET 2.0 (VS 2005)
J'ai le code suivant :
For Each oEnt As Entity In DefaultManager.GetEntities(Of SomeNameSpace.ObjOne)()
PrintValues(Of SomeNameSpace.ObjOneDataRow)(CType(oEnt, SomeNameSpace.ObjOneDataRow))
Next
For Each oEnt As Entity In DefaultManager.GetEntities(Of SomeNameSpace.ObjTwo)()
PrintValues(Of SomeNameSpace.ObjTwoDataRow)(CType(oEnt, SomeNameSpace.ObjTwoDataRow))
Next
[et ça continue pour ObjThree, ObjFour, etc.]
'Signature des fonctions/sub appellées pour une meilleur compréhension
Public Function GetEntities(Of T As IdeaBlade.Persistence.Entity)() As IdeaBlade.Persistence.EntityList(Of T)
[...]
End Function
Private Sub PrintValues(Of T)(ByVal pItem As T)
[...]
End Sub
'Il faut aussi savoir qu'un ObjX inherit de ObjXDataRow et que ObjXDataRow inherit de Entity.
Le problème, c'est que je dois ajouter une boucle à chaque fois qu'on cré un autre ObjX.
Pour rendre la boucle plus dynamique, j'ai pensé à une sub qui ressemble à ça :
Private Sub PrintAll(ByVal pType As System.Type)
For Each oEnt As Entity In DefaultManager.GetEntities(Of pType)()
PrintValues(Of pType.BaseType)(CType(oEnt, pType.BaseType))
Next
End Sub
Cependant, il n'est pas permis de spécifier un type Of avec une variable de type System.Type... Et même problème avec le CType (voir texte de la sub précédente en rouge)
Avec une telle sub, je pourrais alors balayer toutes mes classes par réflexion comme suit :
Private Sub TestReflex()
Dim oAms As Reflection.Assembly = Reflection.Assembly.GetCallingAssembly
For Each oType As Type In oAms.GetTypes
PrintAll(oType)
Next
End Sub
Une idée ??
PS : Désolé du formatage du code, je n'ai pas trouvé quel est le tag pour mettre le code dans des bloc avec les no. de ligne.
bizmoute
Messages postés29Date d'inscriptionvendredi 21 mars 2003StatutMembreDernière intervention21 novembre 2008 24 sept. 2008 à 17:29
Merci pour la réponse nhervagault
C'est noté pour le titre, merci pour la mise en garde ;)
----
Pour l'héritage, il n'y a pas moyen de l'utiliser, car pour récupérer les données (GetEntities), je dois absolument spécifier le type via un paramêtre Of T
----
Ça ne fonctionne pas non plus, car j'ai le même problème : Paramètre de type "Of T" lors de l'appel de ton exemple de PrintValues.
----
Ok, je vais tenter de l'expliquer autrement ;)
'représentation de la classe externe
Public Class EntityFramework
Public Class Entity
End Class
Public Class EntityList(Of T)
Inherits List(Of T)
End Class
Public Shared Function GetEntities(Of T As EntityFramework.Entity)() _
As EntityList(Of T)
'Récupère les données de la BD et en fait des Entity (Objets typés)
End Function
End Class
'représentation de mon code
Public Class NosObjets
Public Class ObjOneDataRow
Inherits EntityFramework.Entity
End Class
Public Class ObjOne
Inherits ObjOneDataRow
End Class
'Point d'entré
Private Sub TestReflex()
Dim oAms As Reflection.Assembly = Reflection.Assembly.GetCallingAssembly
For Each oType As Type In oAms.GetTypes
If oType.BaseType Is GetType(EntityFramework.Entity) Then
PrintAll(oType)
End If
Next
End Sub
Private Sub PrintAll(ByVal pType As System.Type)
For Each oEnt As Entity In _
EntityFramework.GetEntities(Of pType)() '<-- Ne compile pas
PrintValues(Of pType.BaseType) _
(CType(oEnt, pType.BaseType)) '<-- Ne compile pas
Next
End Sub
Private Sub PrintValues(Of T)(ByVal pItem As T)
Dim oProperties() As Reflection.PropertyInfo
'récupère les propriétées public propres à une instance de la classe.
'DeclaredOnly indique qu'on ne désire pas les propriétés des classes héritées
oProperties = GetType(T).GetProperties(Reflection.BindingFlags.DeclaredOnly _
Or Reflection.BindingFlags.Instance _
Or Reflection.BindingFlags.Public)
'balaye les propriétés
For Each oProp As Reflection.PropertyInfo In oProperties
If oProp.CanRead AndAlso oProp.CanWrite Then
Console.WriteLine("{0} = {1}", _
oProp.Name, oProp.GetValue(pItem, Nothing))
ElseIf oProp.CanRead Then
Console.WriteLine("{0}* = {1}", _
oProp.Name, oProp.GetValue(pItem, Nothing))
End If
Next
End Sub
End Class
Les lignes qui ne compilent pas sont dans la sub NosObjets.PrintAll.
Et le but, est de pouvoir travailler avec des objets de type System.Type comme on le voit dans la sub NosObjets.TestReflex
bizmoute
Messages postés29Date d'inscriptionvendredi 21 mars 2003StatutMembreDernière intervention21 novembre 2008 24 sept. 2008 à 17:30
Merci pour la réponse nhervagault
C'est noté pour le titre, merci pour la mise en garde ;)
----
Pour l'héritage, il n'y a pas moyen de l'utiliser, car pour récupérer les données (GetEntities), je dois absolument spécifier le type via un paramêtre Of T
----
Ça ne fonctionne pas non plus, car j'ai le même problème : Paramètre de type "Of T" lors de l'appel de ton exemple de PrintValues.
----
Ok, je vais tenter de l'expliquer autrement ;)
'représentation de la classe externe
Public Class EntityFramework
Public Class Entity
End Class
Public Class EntityList(Of T)
Inherits List(Of T)
End Class
Public Shared Function GetEntities(Of T As EntityFramework.Entity)() _
As EntityList(Of T)
'Récupère les données de la BD et en fait des Entity (Objets typés)
End Function
End Class
'représentation de mon code
Public Class NosObjets
Public Class ObjOneDataRow
Inherits EntityFramework.Entity
End Class
Public Class ObjOne
Inherits ObjOneDataRow
End Class
'Point d'entré
Private Sub TestReflex()
Dim oAms As Reflection.Assembly = Reflection.Assembly.GetCallingAssembly
For Each oType As Type In oAms.GetTypes
If oType.BaseType Is GetType(EntityFramework.Entity) Then
PrintAll(oType)
End If
Next
End Sub
Private Sub PrintAll(ByVal pType As System.Type)
For Each oEnt As Entity In _
EntityFramework.GetEntities(Of pType)() '<-- Ne compile pas
PrintValues(Of pType.BaseType) _
(CType(oEnt, pType.BaseType)) '<-- Ne compile pas
Next
End Sub
Private Sub PrintValues(Of T)(ByVal pItem As T)
Dim oProperties() As Reflection.PropertyInfo
'récupère les propriétées public propres à une instance de la classe.
'DeclaredOnly indique qu'on ne désire pas les propriétés des classes héritées
oProperties = GetType(T).GetProperties(Reflection.BindingFlags.DeclaredOnly _
Or Reflection.BindingFlags.Instance _
Or Reflection.BindingFlags.Public)
'balaye les propriétés
For Each oProp As Reflection.PropertyInfo In oProperties
If oProp.CanRead AndAlso oProp.CanWrite Then
Console.WriteLine("{0} = {1}", _
oProp.Name, oProp.GetValue(pItem, Nothing))
ElseIf oProp.CanRead Then
Console.WriteLine("{0}* = {1}", _
oProp.Name, oProp.GetValue(pItem, Nothing))
End If
Next
End Sub
End Class
Les lignes qui ne compilent pas sont dans la sub NosObjets.PrintAll.
Et le but, est de pouvoir travailler avec des objets de type System.Type comme on le voit dans la sub NosObjets.TestReflex