Nie wierzę, że będziesz w stanie to osiągnąć. Chociaż po wykonaniu select new { c.Name, c.Population }
wydaje się, że nie tworzysz klasy, którą faktycznie jesteś. Jeśli spojrzysz na skompilowane wyjście w Reflectorze lub surowym IL, będziesz w stanie to zobaczyć.
Będziesz mieć klasę, która będzie wyglądać następująco:
[CompilerGenerated]
private class <>c__Class {
public string Name { get; set; }
public int Population { get; set; }
}
(Ok, wyczyściłem go dotknąć, ponieważ nieruchomość jest naprawdę tylko get_Name()
i set_Name(name)
sposób ustawić tak)
To, co próbujesz zrobić, to odpowiednie tworzenie klas dynamicznych, coś, co będzie dostępne, dopóki nie pojawi się .NET 4.0 (a nawet wtedy nie jestem pewien, czy będzie w stanie osiągnąć to, co chcesz).
Jesteś najlepszym rozwiązaniem byłoby zdefiniowanie różnych anonimowych klas, a następnie mieć jakiś logiczny sprawdza, które z nich tworzyć, i utworzyć go można użyć obiektu System.Linq.Expressions.NewExpression
.
Ale może być (przynajmniej teoretycznie) możliwe do zrobienia, jeśli robisz się naprawdę twardy na temat podstawowego dostawcy LINQ. Jeśli jest, pisząc własnego dostawcę LINQ, możesz wykryć, czy aktualnie analizowane wyrażenie jest Select, to musisz określić klasę CompilerGenerated
, zastanowić się nad jej konstruktorem i utworzyć.
Zdecydowanie nie jest to proste zadanie, ale tak samo jak LINQ do SQL, LINQ do XML, itp. To wszystko.
mogłyby księgowania kod, który wpadliśmy do tej pory? – Andy