2010-02-05 15 views
6

Mam pierdnięcie w mózgu próbujące uczynić następującą metodę bardziej ogólną, tak aby każdy List<T> mógł zostać przekazany dla parametru columnValues. Oto co mam:Jak mogę uczynić tę metodę rozszerzenia bardziej ogólną?

public static DataRow NewRow(this DataTable dataTable, List<string> columnValues) 
{ 
    DataRow returnValue = dataTable.NewRow(); 

    while (columnValues.Count > returnValue.Table.Columns.Count) 
    { 
     returnValue.Table.Columns.Add(); 
    } 

    returnValue.ItemArray = columnValues.ToArray(); 
    return returnValue; 
} 

mogę zmienić go na List<object> i przekształcić pierwotną listę przed przekazaniem go do metody, ale jestem pewien, że jest lepszym rozwiązaniem :-)

Edycja :

Post Frank zmusił mnie do ponownego przemyślenia tego. W większości przypadków źródłem List<T> będzie List<object>, ponieważ wartości kolumn będą najprawdopodobniej różnymi typami.

Dla mojego początkowego zastosowania sensownie brzmiał List<string>, ponieważ tworzyłem zbiór danych ze scenariusza CSV, który jest cały tekst w tym punkcie.

Odpowiedz

4

Jesteś po prostu pecha, bo Array Produkt z DataRow jest tablicą obiektów, czyli ostatecznie można tylko przekazać listę obiektów.

Jeśli umieścisz ogólny parametr listy, wszystkie pozycje na liście będą musiały być tego typu, co jest mało prawdopodobne, aby było użyteczne.

Mimo, że w celu uzyskania wielu kolumn, wszystkie z różnych typów, można zmienić metodę rozszerzenia do przyjęcia obiektu do którego instancję typ anonimowy:

table.NewRow(new { A = "Hello", B = 1, C = DateTime.Now }) 

Przy pomocy konwertować anonimowe wartości typu do ciągu znaków, słownika obiektów: by reflection or by a dynamic method powinny być dość przydatne.

+0

Lol jesteś punkt jest doskonały i nie brałem pod uwagę. Dla mojego pierwszego użycia lista miała sens, ponieważ tworzyłem zbiór danych z analizy CSV, która jest w tym momencie całym tekstem. W przypadku większości innych zastosowań nie ma to sensu, ponieważ wartości kolumn najprawdopodobniej będą różne. –

2

Co

IEnumerable<object> 

w związku z

columnValues.Select(x => x.ToString()).ToArray(); 
5

Dlaczego nie wystarczy użyć params object[]:

public static DataRow NewRow(this DataTable dataTable, params object[] objects) 
{ 
    DataRow returnValue = dataTable.NewRow(); 

    while (objects.Length > returnValue.Table.Columns.Count) 
    { 
     returnValue.Table.Columns.Add(); 
    } 

    returnValue.ItemArray = objects; 
    return returnValue; 
} 

Następnie można po prostu nazwać tak:

myDataTable.NewRow(1,2,"hello"); 
1

Co za pomocą zamknięcia w celu określenia sposobu generowania tablicy ItemArray oparciu typu wejściowego

public static DataRow NewRow<T>(this DataTable dataTable, List<T> columnValues, Func<T, string> itemArrayCriteria) 
{ 
    DataRow returnValue = dataTable.NewRow(); 

    while (columnValues.Count > returnValue.Table.Columns.Count) 
    { 
     returnValue.Table.Columns.Add(); 
    } 

    returnValue.ItemArray = columnValues.Select(x => itemArrayCriteria(x)).ToArray(); 
    return returnValue; 
} 
Powiązane problemy