C#如何在内存中保存函数调用以便以后调用

Kei*_*A45 10 c# xna delegates types

在C#中是否有任何方法可以保存函数调用以便以后调用?例如,我希望能够说:

public class MyFunctionCaller
{
    public static void SaveFunctionCallForLater(/* Some parameters*/)
    {
    // Save the Function Call in a variable or a list to be invoked after a set amount of time
   }
}

public class MyProgram
{
    public static void Main()
    {
        // Save a call to 'SpecialFunction' along with its parameters,
        // and maybe the object that's calling it (not applicable in
       // this example context, but important to my question)
        MyFunctionCaller.SaveFunctionCallForLater(/* Stuff */);
    }

    public void SpecialFunction(/* Stuff */)
    {
        // Does some cool stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

让我给你一些上下文:我在XNA中创建一个游戏,我想创建一个DelayedFunctionCaller类,任何对象都可以引用完整的函数调用,以及在调用函数之前等待的时间.我处理所有的时间等待并触发自己,这不是我失去的地方,我只是不确定如何或正确的方式来打包传递给DelayedFunctionCaller的函数.

这里是踢球者:DelayedFunctionCaller必须能够运行任何函数,无论对象是什么发送函数,函数返回什么,或者它需要什么参数**.我已经在我的游戏中有超过100个类,目标是创建一个对象,可以保存任何一个函数调用以便以后调用.

所以从我自己的研究中,我发现了这个Type,我知道我可以保存对象调用的类型,函数名称作为字符串(这是可接受的牺牲),然后GetMethod()用来保存方法MemberInfo,然后使用MemberInfo'sInvoke()来调用函数,甚至是在保存的对象上,以及参数(作为数组Objects).

但这一切似乎都非常......哈哈.我试着查看一次,并认为Generic代表是我想去的方式,但我在那里迷失了,我放弃了.我是在正确的轨道上吗?这是唯一的方法吗?通用代表怎么样,或者当我认为它可以解决我的问题时,我只是想到了什么?

任何和所有的帮助表示赞赏.谢谢!

Asi*_*sik 21

您可以使用lambda表达式将其另存为Action :

Action functionToCallLater = () => SpecialFunction(/* params */);
// later
functionToCallLater(); // calls SpecialFunction with its parameters
Run Code Online (Sandbox Code Playgroud)

如果函数返回某些内容并且您需要其值,则只需使用该Func<T>类型.

int MyMethod(int param) { return param + 1; }
(...)
Func<int> functionToCallLater = () => MyMethod(3);
(...)
int result = functionToCallLater(); // result == 4
Run Code Online (Sandbox Code Playgroud)

请记住,你在lambda中使用的任何变量都是自己捕获的,而不是它的值; 如果它的值改变,那将是调用函数时使用的值.请参阅Eric Lippert的博客,以获得更深入的解释.