Подтвердить что ты не робот

Можно ли передать произвольную группу методов в качестве параметра методу?

Я хотел бы написать функцию, подобную следующей

// The type 'MethodGroup' below doesn't exist.  This is fantasy-code.
public void MyFunction(MethodGroup g)
{
    // do something with the method group
}

Позднее я мог бы называть MyFunction любой группой методов. Что-то вроде этого.

MyFunction(Object.Equals)

Если я передаю подпись, тогда все будет работать нормально.

public void MyFunction(Func<object, object, bool> f)
{
    // do something with known delegate
}
...
MyFunction(Object.Equals)

Группа методов Object.Equals счастливо принуждается к известному типу делегата Func<object, object, bool>, но я не хочу фиксировать конкретную подпись. Я хотел бы передать любую группу методов в MyFunction.

Группы методов не могут быть преобразованы в System.Object

public void MyFunction(object o)
{
    // do something with o
}
...
MyFunction(Object.Equals) // doesn't work

Я думаю, что все забытые фигурные скобки на вызове метода и обнаружили это в какой-то момент. Я надеюсь, что это не означает, что группы методов не (или не могут быть преобразованы) в объекты первого класса.

Я не думаю, что выражения Linq дадут вид общности, которую я ищу, но я, конечно, мог бы что-то упустить.

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

Что мне делать с группой методов? Я мог бы распечатать все подписи всех методов в группе (перегрузки, методы расширения и т.д.), или я мог бы "вызывать" группу с помощью некоторые аргументы (если это возможно, разрешить правильную перегрузку в группе). Существуют и другие способы сделать это, но это некоторые вещи, которые вы можете захотеть сделать с группой методов.

Как уже упоминалось несколько человек, я могу принять Delegate и применить к известному типу делегата при вызове MyFunction.

public void MyFunction(Delegate d)
{
    // do something with d
}
...
MyFunction((Func<object, object, bool>)Object.Equals)

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

4b9b3361

Ответ 1

Вы можете передать делегат:

public void MyFunction(Delegate d)
{
    // do something with the method group
}

Однако при вызове метода вам нужно будет указать тип делегата:

MyFunction(new Func<object, object, bool>(Object.Equals));

Примечание: приведенный выше код не передает группу методов, а один метод... Я не думаю, что можно передать группу методов. Почему вы хотите это сделать?

Ответ 2

Я думаю, что здесь важный вопрос: , что бы вы сделали с группой методов, если бы вы могли когда-нибудь пройти один?

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

Группы методов действительны только как параметры для функций, если функция четко определяет сигнатуру метода. Так, например: public void MyFunction( Func<int> f ) может быть передан группе методов.

Ближе всего вы можете написать функцию, которая принимает тип Delegate:

public void MyFunction( Delegate d ) { ... }

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

// call MyFunction with a particular delegate
MyFunction( (Func<string>)myObj.ToString );  // method group conversion may occur

Ответ 3

Я думаю, вы могли бы использовать такую ​​подпись:

MyFunc<T>(EventHandler<T> newDelegate)
{
    object storedDelegate = newDelegate;
    // after that you can use storedDelegate later
}