2015-01-20 3 views
1

Есть ли способ динамически спроецировать кучу селекторных выражений на новый анонимный тип, который может использоваться, например, .Select() или объединенные элементы доступа?Создать анонимный тип с помощью выражений-переключателей

Скажем, у меня есть класс с 3-мя свойствами

public class DummyClass { 

    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Category { get; set; } 

} 

Для того, чтобы получить доступ к одному из них, используя аксессор член, я могу написать что-то вроде этого:

public class DummyClass... 
    // x => x.Id 
    public static Expression<Func<DummyClass, int>> IdAccessor = f => Id; 

То же самое для Name или Category участник. Теперь я хотел бы вернуть как Id, так и Name в качестве анонимного типа с использованием обоих селекторов.

// combined x => x.Id and x => x.Name into x => new { x.Id, x.Name } 
return new { IdAccessor, NameAccessor } 

Однако я застрял делать это динамически, как я не в состоянии создать анонимный тип, используя, например, Expression.New(), не зная его фактического типа.


EDIT

я переписал вопрос с другим примером, который должен прояснить некоторые другой.

+0

Уход за разработкой? Создание 'ExpandoObject' с помощью' Expression.New() '? – xvdiff

+0

В чем заключен ваш оператор 'return new ...'? Что вы пытаетесь вернуть? Селектор? Или фактический объект анонимного типа? В любом случае, как вы ожидаете решения проблемы, что анонимные типы в основном бесполезны вне метода, в котором они объявлены? Этот вопрос крайне неясен, не в последнюю очередь из-за отсутствия хорошего примера кода, который адекватно иллюстрирует то, о чём вы говорите. –

ответ

0

Не уверен, что вы на самом деле имеете в виду под «обоими селекторами», но это то, как я буду использовать анонимный тип; при выборе конкретных значений из списка объектов. Прокомментируйте это, если это не то, что вы имеете в виду.

var myDummies = new List<DummyClass> ... 

var result = myDummes.Select(o => new 
{ 
    IdAccessor = o.Id, 
    NameAccessor = o.Name 
    Header = String.Format("{0} ({1})", o.Name, o.Category) 
}); 

foreach(var r in result) { ... } 
Смежные вопросы