Создать анонимный тип по выражениям селектора

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() не зная его фактического типа.


РЕДАКТИРОВАТЬ

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

  • 0
    Хотите разработать? Создание ExpandoObject с помощью Expression.New() ?
  • 0
    Каков контекст вашего return new... заявления? Что ты пытаешься вернуть? Селектор? Или фактический объект анонимного типа? В любом случае, как вы ожидаете решить проблему, заключающуюся в том, что анонимные типы бесполезны вне метода, в котором они объявлены? Этот вопрос крайне неясен, и не в последнюю очередь из-за отсутствия хорошего примера кода, который адекватно иллюстрирует, какого черта вы говорите.
Теги:
linq
dynamic
lambda
expression

1 ответ

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) { ... }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню