Я не верю, что вы сможете достичь этого. Хотя, когда вы делаете select new { c.Name, c.Population }
, кажется, что вы не создаете класс, которым вы на самом деле являетесь. Если вы посмотрите на скомпилированный вывод в Reflector или на сырой IL, вы сможете увидеть это.
У вас будет класс, который будет выглядеть примерно так:
[CompilerGenerated]
private class <>c__Class {
public string Name { get; set; }
public int Population { get; set; }
}
(Хорошо, я очистил его от прикосновения, так как в любом случае свойство - это просто метод get_Name()
и set_Name(name)
)
То, что вы пытаетесь сделать, - это правильное создание динамического класса, которое будет недоступно до выхода .NET 4.0 (и даже тогда я не совсем уверен, сможет ли он достичь того, чего вы хотите).
Лучшим решением было бы определить различные анонимные классы, а затем провести некоторую логическую проверку, чтобы определить, какой из них создать, и для его создания вы можете использовать объект System.Linq.Expressions.NewExpression
.
Но, возможно, (по крайней мере, в теории) это можно сделать, если вы действительно разбираетесь в основном поставщике LINQ. Если вы пишете свой собственный поставщик LINQ, вы можете определить, является ли текущее проанализированное выражение Select, а затем определить класс CompilerGenerated
, отразить его конструктор и создать.
Демонстративно непростая задача, но все будет так, как это делают LINQ to SQL, LINQ to XML и т. Д.