繁体   English   中英

在Xname.Get上创建调用表达式时出现System.ArgumentNullException

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM