我正在使用反射来创建 lambda 函数。它适用于我尝试使用的大多数项目,但是在其中一个属性上,它不断抛出不明确的匹配异常。
代码如下所示。当它命中时就会发生错误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);
}
在这种情况下,我只看到一种抛出此类异常的方法:您有多个具有相同名称但大小写不同的属性,如下所示:
public class Test {
public decimal? testProp { get; set; }
public decimal? TestProp { get; set; }
}
或字段:
public class Test {
public decimal? testProp;
public decimal? TestProp;
}
请注意,具有相同名称的属性也可能位于任何父类层次结构中:
public class BaseTest {
public decimal? testProp { get; set; }
}
public class Test : BaseTest {
public decimal? TestProp { get; set; } // also fails
}
原因是Expression.PropertyOrField
这样做是为了搜索所需的属性:
type.GetProperty(propertyOrFieldName, BindingFlags.IgnoreCase | BindingFlags.Instance | BindingFlags.Public | BindingFlags.FlattenHierarchy);
Note BindingFlags.IgnoreCase
and BindingFlags.FlattenHierarchy
。所以你无法告诉Expression.PropertyOrField
以区分大小写的方式进行搜索。
然而,我认为拥有多个同名属性无论如何都是一种不好的做法,应该避免。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)