List可以包含多个void方法吗?

时间:2011-02-06 00:51:18

标签: c# list console void

我试图在C#中创建一个ConsoleApplication。现在我正在研究一个绑定系统,它会读取你输入的密钥,并在绑定时执行操作。

到目前为止,我创建了一个包含ConsoleKey和void Action()的结构Binded 我制作了一份清单,将它放在一个整齐的清单中。

public struct Binded  
        {   
            public ConsoleKey Key;  
            public void Action()  
            {  
//Whatever  
            }  
        }  
List<Binded> Binds

然后我只添加我想要使用的键以及我希望他们采取的操作。现在我可以添加键很好但似乎我无法为每个键设置不同的Action()。 如果您知道问题是什么,或者您对如何做到这一点有了更好的想法,我很想听到它,提前谢谢。

3 个答案:

答案 0 :(得分:5)

首先,我建议使用类而不是结构(或使其不可变)。

话虽如此,您可以通过定义此方法来执行此操作,以获取操作的委托,而不是在struct /类本身中定义Action。

例如:

public class Binding
{
     public Binding(ConsoleKey key, Action action)
     {
            this.Key = key;
            this.Action = action;
     }
     public ConsoleKey Key { get; private set; }
     public Action Action { get; private set; }
}

然后你会这样做:

public List<Binding> Binds;

// Later...
Binds.Add( new Binding(ConsoleKey.L, () => 
   {
       // Do something when L is pressed
   });
Binds.Add( new Binding(ConsoleKey.Q, () => 
   {
       // Do something when Q is pressed
   });

答案 1 :(得分:2)

您应该创建Action类型的属性(这是一种委托类型)

答案 2 :(得分:0)

这样的事情应该可以解决问题。

using System;
using System.Collections.Generic;

namespace ActionableList
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Actionable> actionables = new List<Actionable>
            {
                new Actionable
                    {
                        Key = ConsoleKey.UpArrow,
                        Action = ConsoleKeyActions.UpArrow
                    },
                new Actionable
                {
                    Key = ConsoleKey.DownArrow,
                    Action = ConsoleKeyActions.DownArrow
                },
                new Actionable
                {
                    Key = ConsoleKey.RightArrow,
                    Action = ConsoleKeyActions.RightArrow
                },
                new Actionable
                {
                    Key = ConsoleKey.UpArrow,
                    Action = ConsoleKeyActions.UpArrow
                }
            };

            actionables.ForEach(a => a.Action());

            Console.ReadLine();
        }
    }

    public class Actionable
    {
        public ConsoleKey Key { get; set; }
        public Action Action { get; set; }
    }

    public static class ConsoleKeyActions
    {
        public static void UpArrow()
        {
            Console.WriteLine("Up Arrow.");
        }

        public static void DownArrow()
        {
            Console.WriteLine("Down Arrow.");
        }

        public static void LeftArrow()
        {
            Console.WriteLine("Left Arrow.");
        }

        public static void RightArrow()
        {
            Console.WriteLine("Right Arrow.");
        }
    }
}