[英]System.ArgumentNullException when creating a call expression on Xname.Get
我正在尝试通过使用表达式树在XElement源上创建动态查询。 该查询的一部分需要比较XElement属性的值,并且在构造用于获取属性值的表达式时,我正在获取ArgumentNullException。 它连接到XName.Get的Expression.Call,但在这种情况下我不知道如何解释异常。
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");
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
,因为默认值可以正常工作。)
通过此修改,您的代码段似乎可以正常工作。
我只能猜测,因为所示的此表达式树不可编译。
问题可能是由于您的Expression.Parameter
调用。 参数的引用必须等于传入的任何内容。描述性名称(“ attr1”)仅用于调试目的。
如果那不能解决您的问题,请张贴完整的树(或至少其中的更多树)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.