2011-02-06 3 views
0

im пытается создать приложение ConsoleApplication в C#. Сейчас я работаю над системой привязки, которая будет читать введенный вами ключ и принимать действия, если он привязан.Может ли List использовать несколько методов void?

До сих пор я создал структуру Binded, содержащую ConsoleKey и void Action() , и я создал список Binds, чтобы поместить его в аккуратный список.

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

Затем я просто добавляю Ключи, которые я хочу использовать вместе с действием, которое я хочу, чтобы они взяли. Теперь я могу добавить ключи просто отлично, но кажется, что я не могу установить другое действие() для каждого ключа. Если вы знаете, в чем проблема, или у вас есть лучшая идея о том, как это сделать, я очень хочу это услышать, спасибо заранее.

+5

Не используйте для этого конструкцию. – SLaks

ответ

5

Во-первых, я бы рекомендовал использовать класс вместо структуры (или делает это неизменная).

При этом вы можете сделать это, указав это, чтобы принять делегат к действию, а не определять действие в самом struct/классе.

Например:

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 
    }); 
+0

Спасибо, это именно то, что я искал. – SaintHUN

2

Вы должны сделать свойство типа Action (который является типом делегата)

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."); 
     } 
    } 
} 
Смежные вопросы