Я изучаю «Expression Tree», но я не удается выполнить эти выражения:перечислимых Выбор по Expression Tree
// first case
someList.Select(p => p.SomeProperty);
и
// second case
someList.Select(p => new OtherClass
{
SomeProperty = p.SomeProperty
})
К «первый случай» я попытался сделать это:
var someList = new List<SomeClass>();
someList.Add(new SomeClass { SomeProperty = "Hello" });
var someParam = Expression.Parameter(typeof(SomeClass), "p");
var someProperty = Expression.Property(someParam, "SomeProperty");
Expression.Call(
typeof(Enumerable),
"Select",
new Type[]
{
typeof(SomeClass),
typeof(string)
},
Expression.Lambda(
someProperty,
someParam
)
).Dump();
Но я получаю эту ошибку:
InvalidOperationException: Нет универсального метода «Выбрать» в типе «System.Linq.Enumerable» совместим с аргументами и аргументами поставляемого типа. Аргументы типа не должны предоставляться, если метод не является общим.
О «втором случае», у меня нет идей, как действовать.
Может ли кто-нибудь вести меня здесь?
Я думаю, что вам не хватает параметра IEnumerable, который будет находиться между 'new Type []' и 'Expression.Lambda' в' Expression.Call' –
Will
. Вы не можете использовать прямые деревья выражений с помощью 'Enumerable. * 'методы. Вы должны '.Compile()' их или использовать методы 'IQueryable <> и' Queryable. * '. – xanatos