我在foreach中有一个if语句,并且想知道我是否可以调用不同的方法,具体取决于哪些项是真的而无需进行切换或所有语句的语句。
foreach (var item in buttons)
{
if(item.isClicked)
//call item method
}
按钮不属于Buttons
类
我正在寻找的就像是
button[0]
调用方法start()
button[1]
调用方法options()
我有什么方法可以做到这一点吗?
答案 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
为第二个按钮,x
为n
等等。
答案 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])();
}
}