У меня есть этот метод, который принимает Expr в качестве параметра:
member x.HasSeq (expr:Expr<'a -> 'b seq>) =
let casted = <@ fun z -> (%expr) z :?> ICollection<'b> @>
ManyNavPropertyInfo(cfg.HasMany <| toLinq casted)
Я хочу привести 'b seq
к ICollection<'b>
, который, кажется, работает должным образом, однако, когда он достигает линии, где он собирается преобразовать Expr в LINQ (необходимо сделать это, поскольку cfg.HasMany
исключает System.Expression<Func<'a,ICollection<'b>>>
) просто выдает исключение, говорящее:
InvalidOperationException:
Выражение 'z =>
UnboxGeneric (ToFSharpFunc (z =>
z.Books) .Invoke (z)) 'не является действительным
выражение свойства. Выражение
должен представлять свойство: C #: 't =>
t.MyProperty 'VB.Net:' Функция (t)
t.MyProperty.
Функция, которую я использую для преобразования Expr в LINQ:
let toLinq (exp : Expr<'a -> 'b>) =
let linq = exp.ToLinqExpression()
let call = linq :?> MethodCallExpression
let lambda = call.Arguments.[0] :?> LambdaExpression
Expression.Lambda<Func<'a, 'b>>(lambda.Body, lambda.Parameters)
Ранее я использовал функцию toLinq
без проблем - я думаю, это потому, что я произвел приведение b seq
к ICollection<'b>
, что оставляет UnboxGeneric
в Expr
и при передаче Expr
в toLinq
он просто не знает, что делать с UnboxGeneric
- но, конечно, это всего лишь теория, и я вообще не знаю, что делать, чтобы ее решить.