我正在尝试使用表达式树在XElement源上创建动态查询。此查询的一部分需要比较XElement属性的值,并且在构造用于获取属性值的表达式时,我将获得ArgumentNullException。它连接到Expression.Call for XName.Get但我不知道如何解释这种情况下的异常。
PS:代码中的常量表达式只适用于此示例。
代码:
var value =
Expression.Property(
Expression.Call(Expression.Parameter(typeof(XElement), "attr1"), typeof(XElement).GetMethod("Attribute"),
Expression.Call(typeof(XName).GetMethod("Get", BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly), Expression.Constant("id"))),
"Value");
答案 0 :(得分:1)
typeof(XName).GetMethod(
"Get", BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly)
这是你的问题,正如PetSerAl已经指出的那样。但是删除BindingFlags.Instance
将无法解决任何问题,您需要指定您想要一个静态方法:
typeof(XName).GetMethod(
"Get", BindingFlags.Static | BindingFlags.Public | BindingFlags.DeclaredOnly)
这仍然无效,它会抛出AmbiguousMatchException
,但我们越来越近了。您的Call
有一个string
参数,因此我们需要指定我们想要XName.Get
的重载:
typeof(XName).GetMethod("Get", new[] { typeof(string) })
(我们不需要指定BindingFlags
,因为默认设置正常。)
通过此修改,您的代码段似乎工作正常。
答案 1 :(得分:0)
我只能猜测,因为显示的这个表达式树是不可编译的。
问题可能是因为您Expression.Parameter
来电。参数必须等于传入的内容。描述性名称(" attr1")仅用于调试目的。
如果这不能解决您的问题,请发布整个树(或至少更多)。