在委托中强制转换lambda

本文关键字:转换 lambda | 更新日期: 2023-09-27 18:24:11

我想做完全相同的事情,但使用Where(而不是Add)。Visual Studio告诉我以委托或树类型强制转换它,但我一直坚持这样做,当我尝试强制转换它时,它不起作用。有人能给我一个如何在delegate中强制转换lambda表达式的简短例子吗?

谢谢!

很抱歉编辑延迟。

[AllowAnonymous]
public ActionResult test()
{
    Contexte contexte = new Contexte();
    var listField = contexte.GetType().GetField("<offreStages>k__BackingField", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
    dynamic fldVal = listField.GetValue(contexte);

    fldVal.Where(os => os.id == 1);
    /* Error:
    Cannot use a lambda expression as an argument to a dynamically
    dispatched operation without first casting it to a delegate or
    expression tree type.
    */
    return View();
}

在这篇文章中,它说我们可以使用dynamic直接调用方法,而不需要复杂的Invoke,但正如您所看到的,如果我们需要发送lambda表达式,它就不起作用,而我只是不理解错误(如何强制转换它)。有人能解释一下并给我举个例子吗?

在委托中强制转换lambda

一般来说,编译器对lambda表达式的类型感到困惑。要么强制转换,要么使用构造函数进行澄清。但在这种情况下,Where实际上是在类Enumerable中定义的IEnumerables的扩展方法(注意区别!)。更改您的代码如下:

Contexte contexte = new Contexte();
var listField = contexte.GetType().GetField("<offre_Stages>_k__BackingField", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
// either:
IEnumerable<OS> fldVal = (IEnumerable<OS>)listField.GetValue(contexte); // don't use ``dynamic`` as we know it's an ``IEnumerable`1``
fldVal.Where(os => os.id == 1);
// or:
dynamic fldVal = listField.GetValue(contexte);
Enumerable.Where((IEnumerable<OS>)fldVal, os => os.id == 1); // explicit call to the extension method