gpt4 book ai didi

c# - Expression.PropertyOrField 中的 AmbiguousMatchException

转载 作者:太空狗 更新时间:2023-10-30 01:14:35 26 4
gpt4 key购买 nike

我正在使用反射创建一个 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);

注意 BindingFlags.IgnoreCaseBindingFlags.FlattenHierarchy。所以你不能告诉 Expression.PropertyOrField 以区分大小写的方式进行搜索。

但是我认为,拥有多个同名属性无论如何都是一种不好的做法,应该避免。

关于c# - Expression.PropertyOrField 中的 AmbiguousMatchException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42550615/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com