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 :

création d'une interface générique


Sujet :

VB.NET

  1. #1
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut création d'une interface générique
    Hello,

    J'aimerais créer une interface obligeant mes objets l'implémentant à avoir une propriété Id.

    Jusque là, pas de souci. Sauf que j'aimerais que le type de Id puisse être variable entre les types Byte, Short, Integer et Long.

    Est-ce possible ? Jusqu'ici, je me heurte au mur du typage...
    Kropernic

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Salut,

    Un petit exemple pour étayer.
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  3. #3
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Euh... Je mets cette discussion en stand-by. J'étais en train de détailler en expliquant, je crois que j'ai eu le déclic.

    Je teste et je viens donner un feedback
    Kropernic

  4. #4
    Membre chevronné Avatar de _Ez3kiel
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2013
    Messages
    836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 836
    Points : 1 961
    Points
    1 961
    Par défaut
    Je vois comment faire pour laisser le choix de typage au codeur du dessous ...
    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
        Public Interface IFOO(Of T)
     
            Property id As T
     
        End Interface
     
        Public Class ClassInteger
            Implements IFOO(Of Integer)
     
            Public Property id As Integer Implements IFOO(Of Integer).id
     
        End Class
     
        Public Class ClassDouble
            Implements IFOO(Of Double)
     
            Public Property id As Double Implements IFOO(Of Double).id
     
        End Class
    Mais pour le limiter à seulement une poignée de type ...
    Aider les autres, c'est encore la meilleure façon de s'aider soi-même. Martin Gray

    ToDo : Faire une ToDo List

  5. #5
    Membre confirmé Avatar de Jabbal'H
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2004
    Messages
    403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2004
    Messages : 403
    Points : 580
    Points
    580
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public interface Test<T>
    {
       public T Id { get; set; }
    }
    Un truc comme çà ?

    [Edit] Oups grillé (et mauvais langage en plus)
    " Je préfère comprendre les gens qui ne me comprennent pas "

  6. #6
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Citation Envoyé par Kropernic Voir le message
    J'étais en train de détailler en expliquant, je crois que j'ai eu le déclic.
    Ca, ça arrive souvent, lorsque l'on doit décrire un problème à quelqu'un, il faut reformuler clairement, et là, on perçoit la solution.
    Enfin le sujet est intéressant, on attend ton retour.
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  7. #7
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Citation Envoyé par rv26t Voir le message
    Ca, ça arrive souvent, lorsque l'on doit décrire un problème à quelqu'un, il faut reformuler clairement, et là, on perçoit la solution.
    Enfin le sujet est intéressant, on attend ton retour.
    Et oui ^^. Bon, c'est en cours mais là, j'devrais être parti depuis 1h alors j'arrête et je rentre me faire un barbec .

    La suite lundi !
    Kropernic

  8. #8
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Pour contraindre le type, tu peux forcer le type du paramètre générique à l'aide du type Structure dans ton cas (struct en C#). Par contre ça va accepter d'autres types, comme par exemple le type Guid... Je n'ai pas trouvé plus restrictif.

    Voici un exemple :
    Code VB.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Public Interface MyInterface(Of T As Structure)
     
    	Property Id As T
     
    End Interface

    Quand on implémente l'interface, ça donne ceci (avec pour l'exemple T de type Integer) :
    Code VB.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Public Class MyClass
    	Inherits MyInterface(Of Integer)
     
    	Public Property Id As Integer
    		Get
    			Throw New System.NotImplementedException()
    		End Get
    		Set
    			Throw New System.NotImplementedException()
    		End Set
    	End Property
     
    End Class
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  9. #9
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Bon... Je pensais avoir eu une révélation mais pour le moment, ça ne marche pas. En fait, ça ne compile même pas (tiens, l'ordre des smileys a changé).

    Voici ce que j'ai fait...

    L'interface tout ce qu'il y a de plus con (par contre, ça ne restreint pas aux types entiers mais bon...) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Interface ISavable(Of T)
        Property Id As T
    End Interface
    Une classe l'implémentant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Public Class Day
        Implements DtoBase, ISavable(Of Byte)
     
        Public Property Id As Byte Implements ISavable(Of Byte).Id
        Public Property Name As String
     
        Public Sub New(id As Byte, name As String, isnew As Boolean)
            Me.Id = id
            Me.Name = name
            Me.Isnew = isnew
        End Sub
     
        Public Property Isnew As Boolean Implements DtoBase.Isnew
    End Class
    Et voilà le pourquoi tout ceci, un bout de couche DAL:
    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
        Protected Shared Function CreateParameter(name As String, value As IList(Of ISavable(Of Byte)), prefix As String) As SqlParameter
            Dim param As New SqlParameter
            Dim dt As New DataTable()
            dt.Columns.Add(prefix & "_ID", GetType(Byte))
            dt.PrimaryKey = {dt.Columns(prefix & "_ID")}
            For Each d As PROMO_DTO.Day In value
                Dim dr As DataRow = dt.NewRow
                dr.Item(prefix & "_ID") = d.Id
                dt.Rows.Add(dr)
            Next
            param.Direction = ParameterDirection.Input
            param.ParameterName = name
            param.SqlDbType = SqlDbType.Structured
            param.SqlValue = dt
            Return param
        End Function
    Et la ligne appelant cette fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cmd.Parameters.Add(CreateParameter("@LIST_DAY", promo.Days, "DAY"))

    Le but était de généraliser la création de ce type de paramètre plutôt que de recopier ce bout de code pour chacun comme on peut le voir si dessous :
    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
                Dim strs As New DataTable
                strs.Columns.Add("STR_ID", GetType(Byte))
                strs.PrimaryKey = {strs.Columns("STR_ID")}
                For Each d As PROMO_DTO.Store In promo.Stores
                    Dim dr As DataRow = strs.NewRow
                    dr.Item("STR_ID") = d.Id
                    strs.Rows.Add(dr)
                Next
                cmd.Parameters.Add(CreateParameter("@LIST_STR", strs))
     
     
                Dim tars As New DataTable
                tars.Columns.Add("TAR_ID", GetType(Byte))
                tars.PrimaryKey = {tars.Columns("TAR_ID")}
                For Each d As PROMO_DTO.Target In promo.Targets
                    Dim dr As DataRow = tars.NewRow
                    dr.Item("TAR_ID") = d.Id
                    tars.Rows.Add(dr)
                Next
                cmd.Parameters.Add(CreateParameter("@LIST_TAR", tars))
    Beaucoup de ligne sont similaires... Je pensais donc en faire une fonction. Mais apparemment, VS n'aime pas mon IList(Of ISavable(Of Byte))

    EDIT : Je remarque que j'ai nommé mon interface ISavable... Elle devrait bien sûr se nommer IIdentifiable !! Je réfléchissais à une autre interface stipulant que les objets doivent implémenter une méthode save et mes pensées se sont apparemment mélangées ^^
    Kropernic

  10. #10
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    En castant ma liste dans le type attendu, ça marche...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cmd.Parameters.Add(CreateParameter("@LIST_DAY", CType(promo.Days, IList(Of PROMO_DTO.IIdentifiable(Of Byte))), "DAY"))
    N.B. : J'ai donc ici renommé l'interface.

    Mais je croyais que le fait que ma classe implémente l'interface faisait justement qu'il n'était plus nécessaire de caster...
    Me trompe-je ?
    Kropernic

  11. #11
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    En fait, ça ne marche pas si bien que ça

    J'obtiens l'exception suivante :
    Unable to cast object of type 'System.Collections.Generic.List`1[PROMO_DTO.Day]' to type 'System.Collections.Generic.IList`1[PROMO_DTO.IIdentifiable`1[System.Byte]]'.
    Je vais faire des recherches mais jusqu'ici, ces choses-là m'échappent
    Kropernic

  12. #12
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Il y a, je pense, quelque chose qui m'échappe dans l'utilisation des interfaces.

    Partout on peut lire qu'une interface est un contrat que passe un objet avec le monde extérieur garantissant à ce dernier (le monde extérieur) que le premier (l'objet) possède bien les propriétés et méthodes définies par le contrat (l'interface).

    J'ai donc un objet Day qui implémente IIdentifiable(Of Byte). Pourquoi dans ce cas une List(Of Day) ne peut pas être considéré comme une List(Of IIdentifiable) ? Tout ce que j'ai besoin de savoir, c'est que les objets de cette liste implémente bien IIdentifiable(Of Byte) et donc pour le cas qui nous occupe, qu'ils ont bien une propriété Id de type Byte.

    D'après moi, je devrais pouvoir écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cmd.Parameters.Add(CreateParameter("@LIST_DAY", promo.Days, "DAY"))
    avec la méthode CreateParameter comme ci-dessous :
    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
        Protected Shared Function CreateParameter(name As String, value As List(Of IIdentifiable(Of Byte)), prefix As String) As SqlParameter
            Dim param As New SqlParameter
            Dim dt As New DataTable()
            dt.Columns.Add(prefix & "_ID", GetType(Byte))
            dt.PrimaryKey = {dt.Columns(prefix & "_ID")}
            For Each d As PROMO_DTO.Day In value
                Dim dr As DataRow = dt.NewRow
                dr.Item(prefix & "_ID") = d.Id
                dt.Rows.Add(dr)
            Next
            param.Direction = ParameterDirection.Input
            param.ParameterName = name
            param.SqlDbType = SqlDbType.Structured
            param.SqlValue = dt
            Return param
        End Function
    J'ai beau retourné le problème dans tous les sens, je ne comprends pas pourquoi VS râle sur promo.Days dans l'appelle de la fonction avec la même raison que l'exception que j'ai signalée dans le message précédent...

    Quelqu'un pourrait-il m'expliquer cela ??
    Kropernic

  13. #13
    Membre émérite Avatar de meziantou
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2010
    Messages
    1 223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 223
    Points : 2 439
    Points
    2 439
    Par défaut
    Prenons un exemple concret.
    Tu as 3 classes : Animal, Chien, Chat.
    Un chien est un animal.
    Un chat est un animal.

    Tu crées une liste de chiens. Tu la cast en liste d'animaux. A partir de là tu peux y ajouter un Chat puisque c'est aussi un animal.

    Tu vois bien qu'il y a un problème avec cette logique. Pour plus d'info tu peux regarder du côté de la covariance et de la contravariance.

  14. #14
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Ton exemple parle à priori d'héritage.

    Si je suis bien d'accord qu'une liste d'animaux n'est pas forcément une liste de chiens ou une liste de chat, une liste d'animaux est cependant bien une liste de X (où X est n'importe quel comportement commun aux deux espèces comme par exemple "animaux qui respirent").
    Kropernic

  15. #15
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    A force de fouiller sur le net, j'ai trouvé ce que je voulais...

    Voici une nouvelle définition pour la fonction CreateParameter :
    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
        Protected Shared Function CreateParameter(Of T As PROMO_DTO.IIdentifiable(Of Byte))(name As String, value As List(Of T), prefix As String) As SqlParameter
            Dim param As New SqlParameter
            Dim dt As New DataTable()
            dt.Columns.Add(prefix & "_ID", GetType(Byte))
            dt.PrimaryKey = {dt.Columns(prefix & "_ID")}
            For Each d As T In value
                Dim dr As DataRow = dt.NewRow
                dr.Item(prefix & "_ID") = d.Id
                dt.Rows.Add(dr)
            Next
            param.Direction = ParameterDirection.Input
            param.ParameterName = name
            param.SqlDbType = SqlDbType.Structured
            param.SqlValue = dt
            Return param
        End Function
    Avec ceci, je peux bien faire cet appel : cmd.Parameters.Add(CreateParameter("@LIST_DAY", promo.Days, "DAY")).

    Par contre, la fonction que je montre ici est pour les IIdentifiable(Of Byte). Vu que j'ai besoin de la même fonction pour les types Short et Integer, je cale. Car en recopiant changeant les types, la signature de la fonction reste la même. J'imagine qu'il faut que je généralise aussi le type de l'interface... Je cherche la bonne syntaxe.

    N.B. : Je ne laisse pas tomber le débat lancer par meziantou avec l'exemple des animaux. J'aimerais vraiment savoir si j'ai bien compris le concept d'interface ou non.
    Kropernic

  16. #16
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Bonjour,

    Peut-être avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Protected Shared Function CreateParameter(Of T As PROMO_DTO.IIdentifiable(Of T))(name As String, value As List(Of T), prefix As String) As SqlParameter
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  17. #17
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Citation Envoyé par rv26t Voir le message
    Bonjour,

    Peut-être avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Protected Shared Function CreateParameter(Of T As PROMO_DTO.IIdentifiable(Of T))(name As String, value As List(Of T), prefix As String) As SqlParameter
    Hello Hervé .

    J'y ai pensé mais le type utilisé dans IIdentifiable est utilisé pour ceci (la partie gras souligné) : dt.Columns.Add(prefix & "_ID", GetType(Byte))Il doit sûrement y avoir moyen de récupérer le type dynamiquement mais je ne l'ai encore jamais fait . Je cherche ^^

    EDIT : Ah bin en fait non. Faudrait pouvoir utiliser un second générique. J'ai testé en mettant Y mais il n'en veut... Y a des lettres spécifiques pour définir les génériques ??
    Kropernic

  18. #18
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Ben, tout tes types T vont être en Byte non (ou un autre type - integer, ...) (sinon j'ai pas tout suivi)
    Donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        Protected Shared Function CreateParameter(Of T As PROMO_DTO.IIdentifiable(Of T))(name As String, value As List(Of T), prefix As String) As SqlParameter
            Dim param As New SqlParameter
            Dim dt As New DataTable()
            dt.Columns.Add(prefix & "_ID", GetType(T))
            dt.PrimaryKey = {dt.Columns(prefix & "_ID")}
    pas de lettre spécifique, il n'en veut pas à l'écriture ou à la compil ?
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  19. #19
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Citation Envoyé par rv26t Voir le message
    Ben, tout tes types T vont être en Byte non (ou un autre type - integer, ...) (sinon j'ai pas tout suivi)
    Et non, la liste, ce sont des objets implémentants IIdentifiable. Pas des bytes du tout ^^.

    EDIT :

    J'ai essayé ceci qui compile mais problème lors de l'appel.. Je continue de creuser.
    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
        Protected Shared Function CreateParameter(Of A, T As PROMO_DTO.IIdentifiable(Of A))(name As String, value As List(Of T), prefix As String) As SqlParameter
            Dim param As New SqlParameter
            Dim dt As New DataTable()
            dt.Columns.Add(prefix & "_ID", GetType(A))
            dt.PrimaryKey = {dt.Columns(prefix & "_ID")}
            For Each d As T In value
                Dim dr As DataRow = dt.NewRow
                dr.Item(prefix & "_ID") = d.Id
                dt.Rows.Add(dr)
            Next
            param.Direction = ParameterDirection.Input
            param.ParameterName = name
            param.SqlDbType = SqlDbType.Structured
            param.SqlValue = dt
            Return param
        End Function
    N.B. : J'ai bien deux type génériques différents ici.
    Kropernic

  20. #20
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    J'aurai vu plus simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        Protected Shared Function CreateParameter(T As PROMO_DTO.IIdentifiable(Of Y))(name As String, value As List(Of T), prefix As String) As SqlParameter
            Dim param As New SqlParameter
            Dim dt As New DataTable()
            dt.Columns.Add(prefix & "_ID", GetType(Y))
            dt.PrimaryKey = {dt.Columns(prefix & "_ID")}
            For Each d As T In value
    Mais si ça ne passe pas.

    Peut-tu montrer en même temps comment tu écris ton appel ? (cela permettra de mieux suivre)
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

Discussions similaires

  1. Création d'une interface de saisie assistée
    Par ppipof2000 dans le forum WinDev
    Réponses: 9
    Dernier message: 16/01/2007, 11h13
  2. [Aide] Création d'une interface Ajout/Suppression
    Par Fredods26 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 4
    Dernier message: 19/10/2006, 14h16
  3. [Swing] Création d'une interface graphique SWING + MVC
    Par Sylmandel dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 21/04/2006, 09h03
  4. Réponses: 5
    Dernier message: 23/02/2006, 00h34
  5. [musique] création d'une interface pour se simplifier la vie
    Par Christophe93250 dans le forum Access
    Réponses: 8
    Dernier message: 08/01/2006, 12h21

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