2010-11-28 18 views
5

Estoy creando un juego de rol más pequeño en ASP.NET. En este juego tengo una arquitectura de elementos, donde cada elemento tiene algunos métodos. Por ejemplo, todos los elementos deben compartir un método como "Drop", "Examinar" y "Usar". Algunos elementos se tendrán que extender con métodos como "Operar", "Calcular" y demás.Lista de delegados e invocando

Hasta el momento, han creado la siguiente GameActionList objeto:

public delegate void MyDelegate(); 

public class GameActionList 
{ 
    public List<MyDelegate> Items = new List<MyDelegate>(); 

    public void Add(MyDelegate del) 
    { 
     Items.Add(del); 
    } 

    public void CallDelegates() 
    { 
     foreach (MyDelegate myDelegate in Items) 
     { 
      myDelegate(); 
     } 
    } 
} 

que tienen una clase de artículo base, que tiene esta GameActionList. La obtención de propiedad de esta clase en el artículo base es la siguiente:

public GameActionList Actions 
    { 
     get 
     { 
      GameActionList actions = new GameActionList(); 
      actions.Add(this.Drop); 
      actions.Add(this.Examine); 
      return actions; 
     } 
    } 

Esto está muy bien, pero ... tengo algunos problemas!

Mi problema

Necesito una manera más genérica GameActionList. Necesito tener una lista no solo de vacíos, sino también de funciones. Además, necesito ambos métodos con parámetros y sin parámetros.

Por ejemplo: El método Drop necesitará un objeto Player, por lo que puede soltar el elemento. El Examine método tendrá que devolver una cadena que describe el elemento.

Además, necesito algunos datos que no sé cuando me inicializar el GameActionList: La primera vez que conozco a estos datos cuando invoco el método ...

así que tengo dos preguntas:

  1. ¿Cómo se extiende la GameActionList, por lo que puede contener una lista de ambos vacíos y funciones y estos también pueden tener parámetros o no .. (Y ¿TIENE INCLUSO SENTIDO?)
  2. ¿Cómo puedo dar algunos datos a la método más adelante en el ciclo, como al invocar?

también ... Esto podría ser una manera muy estúpida para hacerlo, por lo que si usted tiene alguna manera de la solución más elegante .. Estoy más que listo para escucharlo!

Muchas gracias ...! Lars

+0

Muchas gracias por aviso :) No sabía que la función .. sólo aceptan las respuestas correctas de últimas preguntas .. :-) –

Respuesta

7

lo más probable es necesario Acción, los delegados Func

Func

Action

+0

Muchas gracias ... Acabo de investigarlo y actualicé mi código, ¡funciona realmente bien! Ahora solo tengo que aprender el DynamicInvoke ... ¡bueno! Genial :) Gracias –