Parametre (Of T) - Aide demandée svp!

bizmoute Messages postés 29 Date d'inscription vendredi 21 mars 2003 Statut Membre Dernière intervention 21 novembre 2008 - 24 sept. 2008 à 15:27
bizmoute Messages postés 29 Date d'inscription vendredi 21 mars 2003 Statut Membre Dernière intervention 21 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.

3 réponses

nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
24 sept. 2008 à 16:07
Salut,

Evite de Mettre Aide demandée dans le titre

----

Il y a-t-il un heritage ou une interface entre tes objets ObectX
Il y a peutre moyen de passer par de l'heritage et des Directcast de ce cas.
-----

ou avec un truc du genre ça peut fonctionner
Private Sub PrintValues(list as List(Of Entities) , type as Type)
   [...]
End Sub

----

La  compréhension  est un  peu  complexe de ton code. (avec l'utilisation de la reférence externe)

 
0
bizmoute Messages postés 29 Date d'inscription vendredi 21 mars 2003 Statut Membre Dernière intervention 21 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

:)
0
bizmoute Messages postés 29 Date d'inscription vendredi 21 mars 2003 Statut Membre Dernière intervention 21 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


:)
0
Rejoignez-nous