быстрый и грязный способ передать метод с параметрами, в качестве параметра? - PullRequest
3 голосов
/ 11 февраля 2010

Позвольте мне просто предварить это тем, что я довольно зеленый для C #. При этом я ищу способ передать метод с параметрами в качестве параметра. В идеале , я хочу сделать следующее:

static void Main(string[] args)
{
    methodQueue ( methodOne( x, y ));
}

static void methodOne (var x, var y)
{
    //...do stuff
}

static void methodQueue (method parameter)
{
    //...wait
    //...execute the parameter statement
}

Кто-нибудь может указать мне правильное направление?

Ответы [ 5 ]

4 голосов
/ 11 февраля 2010

Использование делегата действия

// Using Action<T>

using System;
using System.Windows.Forms;

public class TestAction1
{
   public static void Main()
   {
      Action<string> messageTarget; 

      if (Environment.GetCommandLineArgs().Length > 1)
         messageTarget = ShowWindowsMessage;
      else
         messageTarget = Console.WriteLine;

      messageTarget("Hello, World!");   
   }      

   private static void ShowWindowsMessage(string message)
   {
      MessageBox.Show(message);      
   }
}
4 голосов
/ 11 февраля 2010

Это должно делать то, что вы хотите. На самом деле он передает без параметров параметр вашей функции, но делегат () {methodOne (1, 2);} создает анонимную функцию, которая вызывает methodOne с соответствующими параметрами.

Я хотел проверить это, прежде чем набирать его, но у меня есть только .net framework 2.0, поэтому мой подход.

public delegate void QueuedMethod();

static void Main(string[] args)
{
    methodQueue(delegate(){methodOne( 1, 2 );});
    methodQueue(delegate(){methodTwo( 3, 4 );});
}

static void methodOne (int x, int y)
{

}

static void methodQueue (QueuedMethod parameter)
{
    parameter(); //run the method
    //...wait
    //...execute the parameter statement
}
2 голосов
/ 11 февраля 2010

Использование лямбда-синтаксиса, который почти всегда является наиболее лаконичным способом. Обратите внимание, что это функционально эквивалентно синтаксису анонимного делегата

 class Program
 {
    static void Main(string[] args)
    {
        MethodQueue(() => MethodOne(1, 2));
    }

    static void MethodOne(int x, int y)
    {...}

    static void MethodQueue(Action act)
    {
        act();
    }


 }
2 голосов
/ 11 февраля 2010

Вы можете передать параметризованный метод, который возвращает void, используя делегат действия . Затем вы можете сделать что-то вроде этого:

<code>
public void Main()
{
    MethodQueue(MethodOne);
} 
public void MethodOne(int x, int y) 
{
    // do stuff
}
public void MethodQueue(Action<int, int> method)
{
    // wait
    method(0, 0);
}
Вы также можете использовать делегат Func , если ваш метод должен вернуть значение.
0 голосов
/ 11 февраля 2010

Вы также можете использовать чистую C-альтернативу указателей на функции, но это может стать немного грязным, хотя и работает великолепно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...