我正在使用反射来创建一个lambda函数。它对我尝试使用的大多数项目都有效,但是在其中一个属性上它总是抛出一个Ambiguous Match异常。
代码看起来像这样。当它遇到Expression.PropertyOrField
时发生错误。我使用的属性是decimal?
类型。我认为这可能与它是一个可空类型有关,但我不确定。
public static LambdaExpression CreateExpression(Type type, string propertyName, ref Type returnType)
{
var param = Expression.Parameter(type, "x");
Expression body = param;
foreach (var member in propertyName.Split('.'))
{
body = Expression.PropertyOrField(body, member);
}
returnType = body.Type;
return Expression.Lambda(body, param);
}
2条答案
按热度按时间e3bfsja21#
我认为在这种情况下只有一种方法可以抛出这样异常:您有多个名称相同但大小写不同的属性,如下所示:
或字段:
请注意,具有相同名称的属性也可能位于任何上层父类别中:
原因是
Expression.PropertyOrField
这样做是为了搜索所需的属性:注意
BindingFlags.IgnoreCase
和BindingFlags.FlattenHierarchy
,所以不能让Expression.PropertyOrField
以区分大小写的方式进行搜索。然而,我认为,拥有多个同名属性是一个坏的做法,应该避免。
ahy6op9u2#
这就是我解决这个问题的方法。我在 predicate 构建器中使用
Expression.PropertyOrField
。我有一个扩展方法,它使用Expression
构建器获得一个深度/嵌套属性。我希望它能帮助其他人。这是可以修复不明确匹配问题的实际代码。请根据您的要求更改属性/字段名称。我的示例基于
a
和b
类