Передать метод в качестве параметра, используя C #

Спасибо printf! В среде Linux лучше всего показывать только один файл. Скажем, у вас есть два файла, mongoCmds.js с несколькими командами:

use someDb
db.someColl.find()

, а затем файл оболочки драйвера, runMongoCmds.sh

mongo < mongoCmds.js

Вместо этого есть только один файл, runMongoCmds.sh, содержащий

printf "use someDb\ndb.someColl.find()" | mongo

Bash printf гораздо более надежный, чем echo, и позволяет \n между командами принудительно их на несколько строк.

618
задан carefulnow1 25 August 2016 в 21:02
поделиться

7 ответов

Вы можете использовать DELEGET FUNC в .NET 3.5 в качестве параметра в вашем методе RunTheMethod. Делегат Func позволяет указывать метод, который принимает ряд параметров определенного типа и возвращает один аргумент определенного типа. Вот пример, который должен работать:

public class Class1
{
    public int Method1(string input)
    {
        //... do something
        return 0;
    }

    public int Method2(string input)
    {
        //... do something different
        return 1;
    }

    public bool RunTheMethod(Func<string, int> myMethodName)
    {
        //... do stuff
        int i = myMethodName("My String");
        //... do more stuff
        return true;
    }

    public bool Test()
    {
        return RunTheMethod(Method1);
    }
}
791
ответ дан 22 November 2019 в 21:49
поделиться

Если Вы хотите передать Метод как параметр, используйте:

using System;

public void Method1()
{
    CallingMethod(CalledMethod);
}

public void CallingMethod(Action method)
{
    method();   // This will call the method that has been passed as parameter
}

public void CalledMethod()
{
    Console.WriteLine("This method is called by passing parameter");
}
0
ответ дан 22 November 2019 в 21:49
поделиться
class PersonDB
{
  string[] list = { "John", "Sam", "Dave" };
  public void Process(ProcessPersonDelegate f)
  {
    foreach(string s in list) f(s);
  }
}

второй класс является Клиентом, который будет использовать класс памяти. Это имеет Основной метод, который создает экземпляр PersonDB, и это называет это методом Процесса object’s с методом, который определяется в Клиентском классе.

class Client
{
  static void Main()
  {
    PersonDB p = new PersonDB();
    p.Process(PrintName);
  }
  static void PrintName(string name)
  {
    System.Console.WriteLine(name);
  }
}
0
ответ дан 22 November 2019 в 21:49
поделиться

Вам нужно использовать делегат . В этом случае все ваши методы принимают строку параметр и возврат INT - это наиболее просто представлено функцией FUNC делегатом 1 . Таким образом, ваш код может стать правильным с таким простым изменением, как это:

public bool RunTheMethod(Func<string, int> myMethodName)
{
    // ... do stuff
    int i = myMethodName("My String");
    // ... do more stuff
    return true;
}

Делегаты имеют гораздо больше мощности, чем это, по общему признанию. Например, с C # вы можете создать делегат из выражения лямбда , поэтому вы можете вызвать ваш метод таким образом:

RunTheMethod(x => x.Length);

, который создаст анонимную функцию, подобную этой:

// The <> in the name make it "unspeakable" - you can't refer to this method directly
// in your own code.
private static int <>_HiddenMethod_<>(string x)
{
    return x.Length;
}

, а затем пройти этот делегат к runthemethod метод.

Вы можете использовать делегаты для подписок событий, асинхронного исполнения, обратных вызовов - всевозможных вещей. Он стоит читать на них, особенно если вы хотите использовать LINQ. У меня есть статья , которая является в основном в о различиях между делегатами и событиями, но вы можете все равно найти его полезным.


1 Это только основывается на универсальном FUNC типа делегата в рамках; Вы можете легко заявить о своих собственных:

public delegate int MyDelegateType(string value)

, а затем сделать параметр типа MyDelegateType вместо этого.

345
ответ дан 22 November 2019 в 21:49
поделиться

Вы должны использовать функцию FUNC , который представляет функцию, принимающую строку как аргумент и возврат int :

public bool RunTheMethod(Func<string, int> myMethod) {
    // do stuff
    myMethod.Invoke("My String");
    // do stuff
    return true;
}

Тогда используйте его:

public bool Test() {
    return RunTheMethod(Method1);
}
12
ответ дан 22 November 2019 в 21:49
поделиться

Вот пример без параметра: http://en.charp-online.net/csharp_faq:_how_call_a_method_using_a_name_string

С params: http://www.daniweb.com/forums/thrad98148.html#

Вы в основном проходите в массиве объектов вместе с именем метода. Затем вы используете как с помощью метода Invoke.

Объект параметров [] Параметры

-121--1781603-

Если вы хотите, чтобы способность меняться, какой метод вызывается во время выполнения, я бы порекомендовал использовать делегат: http://www.codeproject.com/kb/cs/delegates_step1. ASPX

Это позволит вам создать объект для хранения метода для звонка, и вы можете пройти это к другим методам, когда он необходим.

6
ответ дан 22 November 2019 в 21:49
поделиться

Вот пример без параметра: http://en.charp-online.net/csharp_faq:_how_call_a_method_using_a_name_string

С params: http://www.daniweb.com/forums/thrad98148.html#

Вы в основном проходите в массиве объектов вместе с именем метода. Затем вы используете как с помощью метода Invoke.

Объект параметров [] Параметры

0
ответ дан 22 November 2019 в 21:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: