Я не верю, что вам удастся этого добиться. Хотя когда вы делаете 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 и т. Д. Все это делают.
person
Aaron Powell
schedule
03.03.2009