【问题标题】:Expressions static method requires null instance non-static method requires non-null instance表达式 静态方法需要空实例 非静态方法需要非空实例
【发布时间】:2015-07-14 21:51:11
【问题描述】:

我是使用表达式的新手,遇到以下错误:

System.ArgumentException : 静态方法需要空实例, 非静态方法需要非空实例。
参数名称:方​​法

代码如下:

        int inP = 100;
        object inParam = inP;
        Type inParamType = inParam.GetType();

        ParameterExpression pe = Expression.Parameter(typeof(S), "pe");

        Expression left = Expression.Property(pe, typeof(S).GetProperty(propName));
        Expression right = Expression.Constant(inParam, inParamType);

        MethodInfo mi = inParamType.GetMethod(operand, BindingFlags.Instance | BindingFlags.Public, null, new Type[] { typeof(object) }, null);
        Expression e1 = Expression.Call(mi, left, right);

【问题讨论】:

    标签: c# expression-trees


    【解决方案1】:

    您正在使用BindingFlags.Instance,因此您只能返回实例方法。实例方法必须调用为 C# a.f(b),而不是 f(a, b),并且转换为表达式树 Expression.Call(left, mi, right),而不是 Expression.Call(mi, left, right)。这就是异常告诉你的:

    静态方法需要空实例,非静态方法需要非空实例。

    在这种情况下,您有一个非静态方法,因此您必须传入一个实例来调用该方法。

    【讨论】:

    • 如果我没看错的话,你建议使用 Expression.Call 的一个重载,它将一个实例(表示为一个表达式)作为第一个参数。在我的例子中,我可以通过将Expression.Constant(instance) 作为第一个参数传递给 Expression.Call 来做到这一点。你觉得这听起来对吗?
    • @RobertHarvey 如果实例不是可变的,例如如果你想手动构造Expression<Func<object, object>> e = a => instance.f(a);,那么理论上你可以通过传递Expression.Constant(instance)作为第一个来构造instance的一部分Expression.Call 的参数,但在实践中,我注意到由于 C# 编译器不这样做(而是将其转换为编译器生成的类中的字段),一些查询提供程序不支持它,不幸的是.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多