为什么Expression.Call抛出参数错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么Expression.Call抛出参数错误相关的知识,希望对你有一定的参考价值。

我正在尝试提取Count方法,所以我可以在以后重用它来构建表达式树。

var g = Expression.Parameter(typeof(IEnumerable<float?>), "g");
var countMethod = typeof(Enumerable)
    .GetMethods()
    .Single(m => m.Name == "Count" && m.GetParameters().Count() == 1);
var countMaterialized = countMethod
    .MakeGenericMethod(new[] { g.Type });
var expr = Expression.Call(countMaterialized, g);

它抛出此错误:

System.ArgumentException:'类型'的表达式System.Collections.Generic.IEnumerable1[System.Nullable1 [System.Single]]'不能用于'System.Collections.Generic.IEnumerable1[System.Collections.Generic.IEnumerable1 [System.Nullable1[System.Single]]]' of method 'Int32 Count[IEnumerable1](System.Collections.Generic.IEnumerable1 [System.Collections.Generic.IEnumerable1[System.Nullable1]类型的参数[System.Single]]])'

我错过了什么?

答案

您的参数类型是正确的,但您的泛型类型应该是“浮动”?而不是“IEnumerable”。

var g = Expression.Parameter(typeof(IEnumerable<float?>), "g");

// get the method definition using object as a placeholder parameter
var countMethodOfObject = ((Func<IEnumerable<object>, int>)Enumerable.Count<object>).Method;

// get the generic method definition
var countMethod = countMethodOfObject.GetGenericMethodDefinition();

// create generic method
var countMaterialized = countMethod.MakeGenericMethod(new[] { typeof(float?) });

// creare expression
var countExpression = Expression.Call(countMaterialized, g);

var expression = Expression.Lambda<Func<IEnumerable<float?>, int>>(countExpression, g);

IEnumerable<float?> floats = Enumerable.Range(3, 5).Select(v => (float?)v);
var count = expression.Compile().Invoke(floats);

以上是关于为什么Expression.Call抛出参数错误的主要内容,如果未能解决你的问题,请参考以下文章

Expression.Call 在简单的 lambda 表达式中。可能吗?

PHP将抛出一个错误问题,怎么解决

graphql 抛出未知参数错误

什么是符号张量,为什么它们会抛出“使用 `steps_per_epoch` 参数”错误?

为啥当参数以(.pl)结尾时,Spring MVC @RequestMapping 会为映射(/user/username:.+)抛出 406 错误

为啥 setState 回调会抛出错误:“来自 useState() 和 useReducer() Hooks 的状态更新不支持第二个回调参数...”