gpt4 book ai didi

c# - 如何使用 Compile 在 Expression> 上调用 DynamicInvoke?

转载 作者:行者123 更新时间:2023-11-30 22:37:41 28 4
gpt4 key购买 nike

为什么这行不通?

namespace InvokeTest
{
public class MethodInvoker
{
public static void Execute<T>(Expression<Action<T>> call)
{
// Parameter count mismatch
call.Compile().DynamicInvoke();

// Also attempted this:
//call.Compile().DynamicInvoke(1);
// but it threw: "Object of type 'System.Int32' cannot be converted to type 'InvokeTest.TestClass'."
}
}

public class TestClass
{
public TestClass()
{ }

public void DoSomething(int num)
{
System.Console.WriteLine("It works");
}

public void KickOff()
{
MethodInvoker.Execute<TestClass>(m => m.DoSomething(1));
}
}
}

最佳答案

Action<T>delegate void F<T>(T t) 相同.即 Action<T>是一个返回类型为 void 的方法并使用 T 的实例.

当你打电话时

MethodInvoker.Execute<TestClass>(m => m.DoSomething(1));

您已设置类型参数 T成为TestClass .因此,你需要传入一个参数,这个参数必须是TestClass的实例。 .

这就是为什么在第一种情况下您会得到参数计数不匹配,而在第二种情况下编译器希望将参数转换为 TestClass 的实例的原因.您需要传递一个参数,并且该参数需要是 TestClass 的一个实例.

注意你的 Action 是

m => m.DoSomething(1).

因此您的操作采用 TestClass 的实例您正在通过 m 对其进行参数化并调用 m.DoSomething(1)在那个例子上。现在,当你动态调用这个方法时,你需要给它一个 TestClass 的实例。 .你没有那样做。

关于c# - 如何使用 Compile 在 Expression<Action<T>> 上调用 DynamicInvoke?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6391644/

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