2009-07-28 8 views
1

Je suis en train d'écrire une fonction générique qui génère un XElement basé sur une liste d'objets, et une propriété de l'objetUtilisation de génériques dans Linq Query?

Actuellement je le code copié et collé dans plusieurs endroits

InputElementsArray = New XElement(New XElement("ArrayInputs", _ 
        New XElement("InputName", "TestFailedRefDesList"), _ 
        New XElement("DataType", "StringArray"), _ 
        New XElement("ValueList", From d In _PassFailItem.FailureDetails Select New XElement("InputValue", d.RefDes)))) 
    InputElements.Add(InputElementsArray) 

Le code ci-dessus fonctionne bien pour moi, mais je préférerais créer une seule fonction qui fait la même tâche donnée d'un objet et une propriété

Private Shared Function CreateBaseArrayInputs(Of T)(ByVal ListOfItems As List(Of T)) As XElement 
    Dim InputElementsArray As XElement = _ 
     New XElement("ArrayInputs", _ 
        New XElement("InputName", "TestFailureCodeList"), _ 
        New XElement("DataType", "StringArray"), _ 
        New XElement("ValueList", From d In ListOfItems Select New XElement("InputValue", d))) 
    Return InputElementsArray 
End Function 

Je ne suis pas sûr de la façon dont je peux génériquement définir la propriété de d à utiliser . Des idées?

Répondre

3

En plus d'utiliser les littéraux XML, Je passerais votre sélecteur de valeur dans votre fonction comme ceci:

Private Shared Function CreateBaseArrayInputs(Of T, TValue)(_ 
     ByVal ListOfItems As List(Of T), _ 
     ByVal selector As Func(Of T, TValue)) As XElement 

    Return <ArrayInputs> 
       <InputName>TestFailureCodeList</InputName> 
       <DataType>StringArray</DataType> 
       <ValueList> 
        <%= From d In ListOfItems _ 
         Select <InputValue><%= selector(d) %></InputValue> %> 
       </ValueList> 
      </ArrayInputs> 
End Function 

Qui appelez-vous comme ceci:

Dim TestArray As XElement = CreateBaseArrayInputs(_PassFailItem.FailureDetails, Function(d) d.FailureCodes) 
+0

C'est très similaire au code que j'utiliserais, cela simplifie simplement le processus de transmission des données. Merci –

0

Je ne pense pas que vous pouvez spécifier une propriété en utilisant des génériques. Je C# vous chat mettre une restriction sur T en utilisant le where keyword, mais il semble que ce n'est pas disponible dans VB.NET. La restriction vous permettrait de spécifier que vous devez implémenter une interface, et donc vous saurez que les propriétés de cette interface seront disponibles.

+0

Il est disponible en VB: http://msdn.microsoft.com/en-us/library/ms235246.aspx –

+0

Merci. J'ai oublié que VB et C# ne partagent pas les mots-clés. –

0

J'ai trouvé une solution au problème. Il est pas aussi élégant que je l'aurais aimé, mais il fonctionne toujours

Voici le code d'appel

Dim TestArray As XElement = CreateBaseArrayInputs((From d In _PassFailItem.FailureDetails Select New XElement("InputValue", d.FailureCodes))) 

Voici la fonction appelée

Private Shared Function CreateBaseArrayInputs(ByVal ListOfItems As IEnumerable(Of XElement)) As XElement 
    Dim InputElementsArray As XElement = _ 
     New XElement("ArrayInputs", _ 
        New XElement("InputName", "TestFailureCodeList"), _ 
        New XElement("DataType", "StringArray"), _ 
        New XElement("ValueList", ListOfItems)) 
    Return InputElementsArray 
End Function 
Questions connexes