2009-07-28 1 views
1

Я пытаюсь написать обобщенную функцию, которая генерирует XElement на основе списка объектов, а свойство объектаИспользование Generics в запросе Linq?

В настоящее время у меня есть этот код скопирован и вставлен в нескольких местах

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) 

выше код отлично работает для меня, но я предпочел бы создать одну единственную функцию, которая делает ту же задачу, учитывая объект и свойство

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 

Я не уверен, о том, как я могу в общем установить свойство г использовать , Есть идеи?

ответ

3

В дополнение к использованию XML литералы, Я передал бы ваш селектор значений в вашу функцию следующим образом:

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 

Что бы вы назвали как это:

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

То, что очень похоже на код, который я бы использовал, просто упрощает процесс передачи данных. благодаря –

0

Я не думаю, что вы можете указать свойство с помощью дженериков. Я C#, вы, кошка, накладываете ограничение на T, используя where keyword, но, похоже, это не доступно в VB.NET.

Ограничение позволит вам указать, что T-элементы должны реализовать интерфейс, и поэтому вы бы знали, что свойства этого интерфейса будут доступны.

+0

Он доступен в VB: http://msdn.microsoft.com/en-us/library/ms235246.aspx –

+0

Спасибо. Забыл, что VB и C# не используют ключевые слова. –

0

Я нашел решение проблемы. Это не так элегантно, как мне бы хотелось, но он все еще работает

Вот код вызова

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

Здесь вызываемая функция

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