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的博客,以获得更深入的解释.
| 归档时间: |
|
| 查看次数: |
8020 次 |
| 最近记录: |