gpt4 book ai didi

c# - Expression.Call 导致 "Static method requires null instance, non-static method requires non-null instance"

转载 作者:太空狗 更新时间:2023-10-29 20:35:45 25 4
gpt4 key购买 nike

我看过类似的 SO 问题,但无法弄清楚为什么我的问题不起作用。我需要转换我的 Func<string, bool>将值赋给要在 Moq 框架中使用的表达式,但在尝试将 Func 转换为表达式时无法传递错误。

这是错误:

Static method requires null instance, non-static method requires non-null instance.

这是我的示例代码:

using System;
using System.Linq.Expressions;

namespace ConsoleApp1
{
class Program
{
public class MyObject
{
public void Add<T>(Func<T, bool> value)
{
// Line below causes error: Static method requires null instance,
// non-static method requires non-null instance.
Expression<Func<T, bool>> expression =
Expression.Lambda<Func<T, bool>>(Expression.Call(value.Method));


// I need to use the expression for the line below that is commented out
// (for context reasons I have included this)
//_myMock.Setup(m => m.MyMethod(key, It.Is(expression))).Returns("test");
}
}

public static void Main(string[] args)
{
// Call it using:
var myObject = new MyObject();
myObject.Add(new Func<string, bool>(x => x.StartsWith("test")));
}
}
}

不确定我的函数是静态的还是非静态的,但我认为它是静态的。我使用调试器检查了 Func 对象,有一个名为“IsStatic”的字段设置为 false (value.Method.IsStatic)。有点困惑还有什么可以尝试。

谢谢。

堆栈跟踪:

System.ArgumentException
HResult=0x80070057
Message=Static method requires null instance, non-static method requires non-null instance.
Parameter name: method
Source=System.Core
StackTrace:
at System.Linq.Expressions.Expression.ValidateStaticOrInstanceMethod(Expression instance, MethodInfo method)
at System.Linq.Expressions.Expression.Call(Expression instance, MethodInfo method, IEnumerable`1 arguments)
at System.Linq.Expressions.Expression.Call(MethodInfo method, Expression[] arguments)
at ConsoleApp1.Program.MyObject.Add[T](Func`2 value) in C:\Users\userName\source\repos\ConsoleApp1\ConsoleApp1\Program.cs:line 14
at ConsoleApp1.Program.Main(String[] args) in C:\Users\userName\source\repos\ConsoleApp1\ConsoleApp1\Program.cs:line 28

最佳答案

您在表达式调用中包装的方法不是静态的。

enter image description here

要调用非静态方法,您需要有效的实例作为 t​​his 传递,如果您实际使用函数外部的一些变量,这可能会变得棘手。您可以进一步检查该方法并查看其声明类型。使 Expression.Call 工作需要它的实例。


如果只是进行模拟设置,因为这是您的目标,您可以修改您的 Add 方法并直接获取表达式

Add<T>(Expression<Func<T, bool>> expression)
{
_myMock.Setup(m => m.MyMethod(key, It.Is(expression))).Returns("test");
}

这只会在这样调用时起作用:

myObject.Add((string x) => x.StartsWith("test"));

enter image description here

关于c# - Expression.Call 导致 "Static method requires null instance, non-static method requires non-null instance",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57767952/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com