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

时间:2015-07-24 15:29:15

标签: c# expression-trees

我正在尝试使用表达式树在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");

2 个答案:

答案 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")仅用于调试目的。

如果这不能解决您的问题,请发布整个树(或至少更多)。