c # передача метода в качестве аргумента в методе - PullRequest
2 голосов
/ 02 июня 2010

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

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

так в основном, как:

private void doSomething(methodToBeCalled) { if(somthingistrue) { methodToBeCalled(someArgument) } }

это возможно?

спасибо заранее

Ответы [ 4 ]

8 голосов
/ 02 июня 2010

Как уже было сказано, для этого вы можете использовать делегатов:

// as in the original post:
private void doSomething(Action methodToBeCalled)
{
    if (somethingIsTrue)
    {
        methodToBeCalled();
    }
}

Для методов без аргументов этот метод называется, например, следующим образом:

private void someMethod()
{
    // ...
}

doSomething(someMethod);

Если вы хотите вызвать метод с аргументами, вы можете обернуть его лямбда-функцией:

private void someMethodWithArgument(int arg)
{
    // ...
}

doSomething( () => someMethodWithArgument(42) );

Конечно, если вызываемые вами методы всегда принимают один и тот же тип аргумента, вы можете объявить свой метод doSomething, чтобы он принимал аргумент Action<T> / Action<T,T> / etc. Если вы хотите, чтобы вызываемые методы возвращали значение, используйте вместо этого делегат из семейства Func<T>.

3 голосов
/ 02 июня 2010

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

public delegate void Del(string message);
// Create a method for a delegate.
public static void DelegateMethod(string message)
{
    System.Console.WriteLine(message);
}
// Instantiate the delegate.
Del handler = DelegateMethod;

// Call the delegate.
handler("Hello World");

В вашем случае

private void doSomething(Del methodToBeCalled) 
{ 
    if(somthingistrue) 
    { 
        methodToBeCalled(someArgument) 
    } 
}

это возможно?

Делегаты

0 голосов
/ 02 июня 2010

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

0 голосов
/ 02 июня 2010

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

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