将方法存储在数组中

时间:2013-11-20 02:59:45

标签: c# xna

我在foreach中有一个if语句,并且想知道我是否可以调用不同的方法,具体取决于哪些项是真的而无需进行切换或所有语句的语句。

foreach (var item in buttons)
{
    if(item.isClicked)
        //call item method 
}

按钮不属于Buttons

我正在寻找的就像是 button[0]调用方法start()
button[1]调用方法options()

我有什么方法可以做到这一点吗?

3 个答案:

答案 0 :(得分:3)

你可以这样做:

private void DoStuff(params Action[] methods) {
    for (int i = 0; i < buttons.Length; i++) {
        if (buttons[i].isClicked) {
            methods[i]();
            break;
        }
    }
}

然后,你会说:

DoStuff(start, options);

start为第一个按钮调用的方法,options为第二个按钮,xn等等。

答案 1 :(得分:2)

假设您的按钮不支持正确events,我认为您要找的是delegate。有几种方法可以做到这一点,但最让人想到的是这样的事情:

Action[] actions = new Action[2]; // create an array of actions, with 1 action for each button
actions[0] = start;
actions[1] = options;

...

for(var i = 0; i < buttons.Length; i++)
{
    if(buttons[i].isClicked)
        actions[i]();
}

答案 2 :(得分:1)

有几种方法可以实现这一点,你使用哪种方式实际上取决于你修改“按钮”类别的访问权限(你实际上并没有告诉我们它是什么)。

选项1:向班级添加新成员(假设“按钮”类是您自己的班级)
修改您的类以拥有一个名为Action的新成员或某个此类名称。该成员将是Delegate(注意:如果您知道每个按钮的操作具有相同的方法签名,则可以使用更具体的类型,如Action<T>。一旦您声明了此成员,您就可以轻松地调用它。伪代码:

public class MyButton {
    public bool isClicked { get; }
    public Delegate action { get; }
}

foreach (var item in buttons) {
    if(item.isClicked)
        ((Action)item.action)(); // assuming that your "action" is a method which returns nothing and takes no arguments, cast to a more appropriate type if needed
}

选项2:将每个按钮映射到某个操作 类似于选项1的原理,除了因为您无法直接修改支持类,您必须在事后将操作绑定到按钮。您可以创建地图(或C#中的Dictionary<TKey,TValue>)以将按钮映射到其操作。为此,请创建一个新的Dictionary并将每个按钮添加为其操作的键:

// Declared at class-scope 
private readonly Dictionary<MyButton,Delegate> _actions = new Dictionary<MyButton,Delegate>(); // I don't know what type 'buttons' is so I'm substituting it with "MyButton"

// In some initializer for the class (i.e the constructor)
_actions.Add(buttons[0], start)
_actions.Add(buttons[1], options)
// .. etc

// Then your loop becomes something like:
foreach(var item in buttons) {
    if (item.isClicked && _actions.ContainsKey(item)) {
        ((Action)_actions[item])();
    }
}