2012-11-22 29 views
6

Chcę dynamicznie wybierać kolumny z List w następujący sposób. Więc jaki może być najlepszy sposób?Jak wybrać dynamiczną kolumnę z listy

//a objects list 
List<DashBoard> dashboardlist = (List<DashBoard>)objList; 
string strColumns = "RecDate,ModifiedDate"; 
objList = (from obj in dashboardlist select new { strColumns }).ToList(); 

///////////// ok, po prostu zapomnieć wykazie obiektów, że mam tabeli bazy danych, które mają numer ID kolumnie, imię, wiek, płeć, itd ..Then í posiadają kolumnę do wyświetlenia, a kolumnaList zmienia się zgodnie z warunkiem. WIĘC mam listę ludzi; i listę columnTemplate; więc teraz chcę wybrać kolumnę na podstawie szablonu.

+4

Jak planujesz użyć 'objList'? Mam nadzieję, że zdajesz sobie sprawę, że nie będzie tak łatwo uzyskać dostęp do właściwości, jak podczas statycznego definiowania kolumn ('wybierz nowy {obj.RecDate, obj.ModifiedDate}'), który wybierasz, aby C# mógł utworzyć dla ciebie anonimowy typ . Łatwiej byłoby po prostu dalej korzystać z pełnych obiektów 'DashBoard' i tylko odczytać właściwości określone przez łańcuchy w razie potrzeby. –

+0

Jaka jest sytuacja, która wywołała to pytanie? Byłbym skłonny zgodzić się z Timem S - trzymać się obiektu Dashboard –

+0

Czy istnieje jakikolwiek powód, dla którego musisz zwrócić anonimowy obiekt, lub czego potrzebujesz, aby zwrócić 'List ' z różnymi właściwościami zainicjowanymi? –

Odpowiedz

6

Dzięki za dostarczenie pomysłów na moje pytanie.Oczywiście kilka godzin w Google Znalazłem solution.

public void Test() { 
    var data = new[] { 
     new TestData { X = 1, Y = 2, Z = 3 } 
    , new TestData { X = 2, Y = 4, Z = 6 } 
    }; 
    var strColumns = "X,Z".Split(','); 
    foreach (var item in data.Select(a => Projection(a, strColumns))) { 
     Console.WriteLine("{0} {1}", item.X, item.Z); 
    } 
} 
private static dynamic Projection(object a, IEnumerable<string> props) { 
    if (a == null) { 
     return null; 
    } 
    IDictionary<string,object> res = new ExpandoObject(); 
    var type = a.GetType(); 
    foreach (var pair in props.Select(n => new { 
     Name = n 
    , Property = type.GetProperty(n)})) { 
     res[pair.Name] = pair.Property.GetValue(a, new object[0]); 
    } 
    return res; 
} 
class TestData { 
    public int X { get; set; } 
    public int Y { get; set; } 
    public int Z { get; set; } 
} 
1

Zakładam, że lista kolumn może pochodzić ze źródła zewnętrznego i zmian, proponuję:

z odbicia można produkować listę FieldInfo które odpowiadają każdej kolumny, a następnie w pętli nad każdej pozycji wymienionej listę i każdą FieldInfo i wywołaj GetValue na obiekcie danych.

0

Załóżmy, że masz tylko 2 szablonów. Możesz utworzyć metodę dla każdego szablonu, która zwróci tylko potrzebne kolumny. Coś takiego:

// method for template 1 - returns only 3 columns/properties 
private DashBoard CreateDashBoardXxxxxxx(DashBoard item) 
{ 
    return new DashBoard { 
     Property1 = item.Property1, 
     Property4 = item.Property2, 
     Property3 = item.Property3 
    }; 
} 

// method for template 2 - returns N columns/properties 
private DashBoard CreateDashBoardYyyyyyyy(DashBoard item) 
{ 
    return new DashBoard { 
     Property1 = item.Property1, 
     Property4 = item.Property2, 

     // Other properties 
     // ..... 

     PropertyN = item.PropertyN 
    }; 
} 

Następnie można stosować te same metody tak:

List<DashBoard> dashboardlist = (List<DashBoard>)objList; 

// using template 1 
var list = dashboardlist.Select(CreateDashBoardXxxxxxx); 

// using template 2 
var list2 = dashboardlist.Select(CreateDashBoardYyyyyyyy); 

Trzeba tylko zrobić trochę kodu aby zdecydować, który szablon powinien być stosowany.

Mam nadzieję, że to pomoże!

Powiązane problemy