Я изучаю "Дерево выражений", но мне не удается выполнить эти выражения:
// 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: ни один универсальный метод Select для типа System.Linq.Enumerable не совместим с предоставленными аргументами и аргументами типа. Не следует указывать аргументы типа, если метод не является универсальным.
Что касается «второго случая», я понятия не имею, как поступить.
Может ли кто-нибудь направить меня сюда?
new Type[]
иExpression.Lambda
в вашемExpression.Call
- person Will   schedule 26.06.2015Enumerable.*
. Вы должны.Compile()
их или использовать методыIQueryable<>
иQueryable.*
. - person xanatos   schedule 26.06.2015